Я столкнулся с символом Unicode спецификации при разборе файла CSV и нашел это изящное решение, которое решило проблему.
//Remove UTF8 Bom
function remove_utf8_bom($text) {
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
Ссылка: Как удалить несколько последовательностей спецификации UTF-8 перед "<! DOCTYPE>"?
Однако я не совсем понимаю, как это работает, и мне было интересно, может ли кто-нибудь объяснить, что здесь происходит.
Некоторые вопросы, которые у меня есть:






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);
Вышеупомянутое не работает без функции pack ().
@fsociety Вам нужно знать. см. вопрос это
Спасибо за ответ. Как определить, является ли что-то необработанным потоком данных UTF-8?