preg_replace UTF-8 BOM Unicode字符

时间:2018-10-03 07:46:27

标签: php unicode utf-8 byte-order-mark

我在解析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>"?

但是,我不完全了解它的工作原理,想知道是否有人可以解释这里发生的事情。

我有一些问题:

  1. “ EFBBBF”是BOM Unicode字符的十六进制表示吗?
  2. 什么是H *? (我假设这是我们指定'EFBBBF'字符串格式的方式)
  3. 是否有必要将“ EFBBBF”转换为二进制表示形式?
  4. 当我尝试打印$ bom变量时,它只是一个空字符串。为什么BOM表是不可见的?
  5. preg_replace如何与二进制字符一起使用?

1 个答案:

答案 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