从字符串中删除 ÿþ
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。
您可以使用 iconv
或 mb_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
。以上是关于从字符串中删除 ÿþ的主要内容,如果未能解决你的问题,请参考以下文章