从字符串中删除 ÿþ

Posted

技术标签:

【中文标题】从字符串中删除 ÿþ【英文标题】:Remove ÿþ from string 【发布时间】:2014-10-21 17:50:20 【问题描述】:

我正在尝试批量读取 ID3 数据。在某些曲目上,出现了ÿþ。我可以删除前 2 个字符,但这会伤害没有它的曲目。

这是我目前拥有的:

$trackartist=str_replace("\0", "", $trackartist1);

任何建议都会非常好,谢谢!

【问题讨论】:

str_replace("ÿþ", "", $trackartist1); 工作吗? 不,它没有。 @Carpetsmoker 你能提供一个ID3数据的示例字符串吗? str_replace 支持多字节字符串,@Carpetsmoker 的建议似乎有效:codepad.org/Od59V0ki 为什么@Carpetsmoker 的建议不起作用?这似乎是这里的答案。为了更进一步,您可以在 str_replace 周围添加一个 IF 语句,以查看是否首先以“ÿþ”开头。 你能发布一个var_dump() 你的字符串来看看它到底包含什么吗? 【参考方案1】:

ÿþ 在 UTF-8 中是 0xfffe;这是 UTF-16 中的 byte order mark。 您可以使用 iconvmb_convert_encoding() 将字符串转换为 UTF-8:

$trackartist1 = iconv('UTF-16LE', 'UTF-8', $trackartist1);

# Same as above, but different extension
$trackartist1 = mb_convert_encoding($trackartist1, 'UTF-16LE', 'UTF-8');

# str_replace() should now work
$trackartist1 = str_replace('ÿþ', '', $trackartist1);

这假定$trackartist1 始终是UTF-16LE;检查您的 ID3 标签库的文档,了解如何获取标签的编码,因为不同文件的编码可能不同。您通常希望将所有内容都转换为 UTF-8,因为这是 php 默认使用的。

【讨论】:

当我使用 $trackartist1 = iconv('UTF-8', 'UTF-16', $trackartist1);str_replace('ÿþ', '', $trackartist1); 时,它会在开头切换到 þÿ 第二个应该是mb_convert_encoding($message, 'UTF-8', 'UTF-16LE')【参考方案2】:

我遇到了类似的问题,但无法强制 UTF-16LE,因为输入字符集可能会更改。最后我detect UTF-8如下:

if (!preg_match('~~u', $html)) 

如果失败我obtain the correct encoding through the BOM:

function detect_bom_encoding($str) 
    if ($str[0] == chr(0xEF) && $str[1] == chr(0xBB) && $str[2] == chr(0xBF)) 
        return 'UTF-8';
    
    else if ($str[0] == chr(0x00) && $str[1] == chr(0x00) && $str[2] == chr(0xFE) && $str[3] == chr(0xFF)) 
        return 'UTF-32BE';
    
    else if ($str[0] == chr(0xFF) && $str[1] == chr(0xFE)) 
        if ($str[2] == chr(0x00) && $str[3] == chr(0x00)) 
            return 'UTF-32LE';
        
        return 'UTF-16LE';
    
    else if ($str[0] == chr(0xFE) && $str[1] == chr(0xFF)) 
        return 'UTF-16BE';
    

现在我可以使用iconv(),正如您在@carpetsmoker answer 中看到的那样:

iconv(detect_bom_encoding($html), 'UTF-8', $html);

我没有使用 mb_convert_encoding(),因为它没有删除 BOM(也没有像 iconv() 那样转换换行符):

【讨论】:

【参考方案3】:

使用正则表达式替换:

$trackartist1 = preg_replace("/\x00?/", "", $trackartist1);

如果可能,上面的正则表达式会寻找“\x00”(十六进制零)的第一次出现,并将其替换为空。

【讨论】:

@Carpetsmoker 我的错!我以为他想得到\0 字符,如他的代码中所述。我没注意到\xfffe

以上是关于从字符串中删除 ÿþ的主要内容,如果未能解决你的问题,请参考以下文章

动态内存分配问题

在数据库中保存表情符号时出现奇怪的字符。这是正常的吗?

样式表在服务器上出现损坏

替换 T-SQL 中的 Unicode 字符

tomcat/jdbc/mysql: 可以插入 ÿ(U+00FF) 但不能插入 Ā (U+0100)

如何恢复西里尔短语“Âñòîðîíó Äîæäÿ”的正确字符编码?