我正在尝试批量阅读ID3数据。在某些曲目上,ÿþ出现。我可以删除前两个字符,但这会伤害没有它的曲目。
这就是我目前所拥有的:
$trackartist=str_replace("\0", "", $trackartist1);
任何建议都会很棒,谢谢!
答案 0 :(得分:8)
ÿþ
是UTF-8中的0xfffe;这是UTF-16中的byte order mark。
您可以使用iconv
或mb_convert_encoding()
$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默认使用的内容。
答案 1 :(得分:1)
我遇到了类似的问题,但由于输入字符集可能会发生变化,因此无法强制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';
}
}
现在,我可以在@carpetsmoker answer中看到iconv()
使用iconv(detect_bom_encoding($html), 'UTF-8', $html);
:
mb_convert_encoding()
我没有使用iconv()
,因为它没有移除BOM(并且没有像{{1}}那样转换换行符):
答案 2 :(得分:0)
使用正则表达式替换:
$trackartist1 = preg_replace("/\x00?/", "", $trackartist1);
上面的正则表达式首先出现“\ x00”(十六进制零),如果可能的话,用任何东西替换它。