我在解析CSV文件时遇到了BOM BOM Unicode字符,并找到了解决问题的简洁解决方案。
//Remove UTF8 Bom
function remove_utf8_bom($text) {
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
链接:How to remove multiple UTF-8 BOM sequences before "<!DOCTYPE>"?
但是,我不完全了解它的工作原理,想知道是否有人可以解释这里发生的事情。
我有一些问题:
答案 0 :(得分:2)
BOM
是Unicode字符U+FEFF
。
EFBBBF
是此字符的UTF-8编码的十六进制表示。 pack('H*', ...)
接受一个字符串并将其转换为字节,假定字符串中的每对字符都以十六进制表示字节值。
将BOM
写为字符串EFBBBF
使其更容易键入,但这确实意味着您必须使用pack
将其转换为字节,以便将其与{{ 1}}。
BOM
在打印时是不可见的,因为BOM
是Unicode字符U+FEFF
,如果它是文件中的第一个字符,则仅用作ZERO WIDTH NO-BREAK SPACE
。
为了使其正常工作,BOM
必须是原始UTF-8数据流。如果已将其从UTF-8解码为字符,则可以跳过其中的大部分内容,只需编写
$text