Преобразование кодировки в PHP (ISO-8859-1, UTF-8, CP1250) - PullRequest
2 голосов
/ 20 апреля 2020

Я хочу работать с данными из файла CSV, но я понял, что буквы не отображаются правильно. Я пробовал миллион способов конвертировать кодировку, но ничего не работает. Работа на MacOS, PHP 7.4.4.

После выполнения fgets() или fgetcsv() для переменной дескриптора я получу это (2 строки / строки в примере).

Kód ADM;Kód obce;Název obce;Kód MOMC;Název MOMC;Kód MOP;Název MOP;Kód èásti obce;Název èásti obce;Kód ulice;Název ulice;Typ SO;Èíslo domovní;Èíslo orientaèní;Znak èísla orientaèního;PSÈ;Souøadnice Y;Souøadnice X;Platí Od

1234;1234;HorniDolni;;;;;1234;HorniDolni;;;è.p.;2;;;748790401;4799.98;15893971.21;2013-12-01T00:00:00

Это более или менее правильный чешский язык, но буква č заменена è, а ř заменена ø, ни одна из них не является частью чешского алфавита. Я уверен, что в файле будет больше неуместных букв.

Выполнение file -I path/to/file Я получаю file: text/plain; charset=iso-8859-1, что печально, потому что в wiki эта кодировка не включает чешский алфавит.

Ни одна из следующих команд не преобразовала неуместные буквы: mb_convert_encoding($line, 'UTF-8', 'ISO8859-1') iconv('ISO-8859-1', 'UTF-8', $line) iconv('ISO8859-1', 'UTF-8', $line)

Я заметил, что в ISO-8859-1 * Буква 1027 * имеет код 00F8. Windows -1250 (включая чешский алфавит) имеет правильную букву ř с кодом 0159 , но им обоим предшествует 00F8. То же самое с буквами č и è, которым предшествует код 00E7. Я не очень хорошо понимаю кодирование, но кажется, что файл закодирован в Windows -1250, но интерпретатор считает, что кодировка соответствует ISO-8859-1, и принимает букву, которая находится на месте / код исходного кода.

Но ни одно преобразование (ISO-8859-1 => Windows -1250, ISO-8859-1 => UTF-8 или наоборот) не работает.

Есть ли у кого-нибудь есть идеи как это решить? Спасибо!

1 Ответ

4 голосов
/ 20 апреля 2020

Проблема с 8-битной кодировкой символов заключается в том, что для интерпретации правильной кодовой страницы в большинстве случаев требуется человеческий интеллект.

Когда вы запускаете file для файла, может получиться, что файл в основном сделан из печатных символов, но поскольку он смотрит только на байты, он не может легко отличить iso-8895-1 от iso-8895-2. Для file, 0x80 совпадает с 0x80.

file может только сказать, что файл является текстовым и, вероятно, iso-8895- * или windows - *, из-за использование 0x80-0xFF. Т.е. не только ASCII.

(кодировки Unicode, такие как UTF-8 и UTF-16, легче обнаружить по их последовательности байтов или метке порядка байтов, установленной в верхней части файла)

Существуют некоторые интеллектуальные детекторы кодовых страниц символов, которые с помощью словарей из разных языков могут оценивать кодовую страницу на основе последовательности символов / байтов.

Вероятное преобразование, которое вам нужно, это просто iso-8895-2 -> UTF-8.

Для вас важно то, что вы знаете исходную кодировку (интерпретацию), а затем, когда вы проверяете ее, точно знаете, какую кодировку вы просматриваете.

Например, PHP будет по умолчанию установите кодировку HTTP на iso-8895-1. Это означает, что вполне возможно, что вы правильно конвертируете в iso-8895-2, но ваш браузер тогда "интерпретирует" как iso-8895-1.

. Лучший способ проверить это сохранить файл на диск, а затем использовать текстовый редактор, такой как VS Code , перед тем, как открывать файл, перед тем как открыть файл , для которого необходимо задать требуемую кодировку.

Если вам нужна дополнительная помощь, вам нужно отредактировать вопрос, включив в него точный код использование.

...