BOM
- это символ Unicode U+FEFF
.
EFBBBF
- это шестнадцатеричное представление кодировки UTF-8 этого символа.pack('H*', ...)
берет строку и преобразует ее в байты, предполагая, что каждая пара символов в строке представляет значение байта в шестнадцатеричном формате.
Запись BOM
в виде строки EFBBBF
упрощает ввод,но это означает, что вы должны преобразовать его в байты, используя pack
, чтобы сравнить его с BOM
в начале ваших данных.
BOM
невидим при печати, потому что U+FEFF
- это символ Unicode ZERO WIDTH NO-BREAK SPACE
, он используется только как BOM
, если это первый символ в файле.
Для правильной работы $text
должен быть необработанным потоком данных UTF-8.Если он был декодирован из UTF-8 в символы, вы можете пропустить большую часть этого и просто написать
$text = preg_replace("/^\uFEFF/", '', $text);