Время от времени я сталкиваюсь с файлами, которые имеют странную (неправильную?) Кодировку символов умлаута в именах файлов. Может быть, кодировка исходит от системы Mac, но я не уверен. Я работаю с Windows.
Например:
Volkszählung
вместо Volkszählung
(попробуйте использовать Backspace после первой буквы).
При вставке в ANSI-файл с помощью notepad ++ он вставляется Volksza¨hlung
,
У меня есть два вопроса:
а) Откуда это происходит и какая это кодировка?
б) Использование glob()
в PHP не перечисляет эти файлы при использовании символа подстановки *
, Как можно обнаружить их в PHP?
Это комбинирующий характер: в частности, U + 0308 ДИАРЕЗ КОМБИНИРОВАНИЯ. Комбинирование персонажей — это то, что позволяет вам делать такие вещи, как умлаутс любой символ, а не только определенные «предварительно составленные» символы со встроенными умлатами, как U + 00E4 МАЛЕНЬКОЕ ПИСЬМО А С ДИАРЕЗОМ. Хотя это не необходимо использовать объединяющий символ в этом случае (поскольку существует подходящий предварительно составленный символ), это не неправильно или.
(Обратите внимание, что это вовсе не «кодировка»: в контексте Unicode кодировка — это метод преобразования Unicode элемент кода числа в последовательности байтов, чтобы они могли быть сохранены в файле. UTF-8 и UTF-16 являются кодировками. Но объединение символов — это кодовые точки Unicode, как и обычные символы; они не созданы в процессе кодирования.)
Если вы работаете с текстом Unicode, вы должны использовать PHP MBstring функции. Встроенные строковые функции не поддерживают Unicode и видят строки только как последовательности байтов, а не последовательности символов. Я не уверен, как mbstring относится к комбинированию символов; насколько я вижу, в документации их вообще нет.
Вы также должны взглянуть на графемные функции, которые специально предназначены для совмещения персонажей. «Единица графемы» — это отдельный визуальный символ, созданный базовой кодовой точкой символа плюс любые комбинирующие символы, следующие за ней.
Наконец, PCRE регулярные выражения поддерживать \X
escape-последовательность это соответствует целым кластерам графемы, а не отдельным кодам.
Других решений пока нет …