Странная кодировка умлаута в файловой системе

Время от времени я сталкиваюсь с файлами, которые имеют странную (неправильную?) Кодировку символов умлаута в именах файлов. Может быть, кодировка исходит от системы Mac, но я не уверен. Я работаю с Windows.

Например:
Volkszählung вместо Volkszählung (попробуйте использовать Backspace после первой буквы).

При вставке в ANSI-файл с помощью notepad ++ он вставляется Volksza¨hlung,

У меня есть два вопроса:
а) Откуда это происходит и какая это кодировка?
б) Использование glob() в PHP не перечисляет эти файлы при использовании символа подстановки *, Как можно обнаружить их в PHP?

3

Решение

Это комбинирующий характер: в частности, U + 0308 ДИАРЕЗ КОМБИНИРОВАНИЯ. Комбинирование персонажей — это то, что позволяет вам делать такие вещи, как умлаутс любой символ, а не только определенные «предварительно составленные» символы со встроенными умлатами, как U + 00E4 МАЛЕНЬКОЕ ПИСЬМО А С ДИАРЕЗОМ. Хотя это не необходимо использовать объединяющий символ в этом случае (поскольку существует подходящий предварительно составленный символ), это не неправильно или.

(Обратите внимание, что это вовсе не «кодировка»: в контексте Unicode кодировка — это метод преобразования Unicode элемент кода числа в последовательности байтов, чтобы они могли быть сохранены в файле. UTF-8 и UTF-16 являются кодировками. Но объединение символов — это кодовые точки Unicode, как и обычные символы; они не созданы в процессе кодирования.)

Если вы работаете с текстом Unicode, вы должны использовать PHP MBstring функции. Встроенные строковые функции не поддерживают Unicode и видят строки только как последовательности байтов, а не последовательности символов. Я не уверен, как mbstring относится к комбинированию символов; насколько я вижу, в документации их вообще нет.

Вы также должны взглянуть на графемные функции, которые специально предназначены для совмещения персонажей. «Единица графемы» — это отдельный визуальный символ, созданный базовой кодовой точкой символа плюс любые комбинирующие символы, следующие за ней.

Наконец, PCRE регулярные выражения поддерживать \X escape-последовательность это соответствует целым кластерам графемы, а не отдельным кодам.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]