preg_replace UTF-8 BOM Unicode символ - PullRequest
       50

preg_replace UTF-8 BOM Unicode символ

0 голосов
/ 03 октября 2018

Я столкнулся с символом Unicode спецификации при анализе CSV-файла и нашел это замечательное решение, которое решило проблему.

//Remove UTF8 Bom
function remove_utf8_bom($text) {
    $bom = pack('H*','EFBBBF');
    $text = preg_replace("/^$bom/", '', $text);
    return $text;
}

Ссылка: Как удалить несколько последовательностей спецификации UTF-8 раньше "«?

Однако я не совсем понимаю, как это работает, и мне было интересно, если бы кто-то мог объяснить, что здесь происходит.

Некоторые мои вопросы:

  1. Является ли 'EFBBBF' представлением HEX символа Unicode спецификации?
  2. Что такое H *? (Я предполагаю, что именно так мы определяем формат строки 'EFBBBF')
  3. Нужно ли преобразовывать EFBBBF в двоичное представление?
  4. Когда я пытаюсь напечатать переменную $ bom, это просто пустая строка. Почему невидимая спецификация?
  5. Какpreg_replace работает с двоичными символами?

1 Ответ

0 голосов
/ 03 октября 2018

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); 
...