Конвертировать utf-8 обратно в однобайтовый двоичный файл в PHP

У меня есть много изображений, которые были импортированы из дампа SQL с кодировкой utf-8. Таким образом, вместо "FF D8 FF E0" я вижу "C3 BF C3 98 C3 BF C3 A0" в начале изображений JPEG.

Я пробовал iconv('utf-8', 'iso-8859-1', $data), но он не конвертирует весь файл (в utf-8 есть символы, которые нельзя конвертировать в iso-8859-1.

Как я могу преобразовать простой UTF-8 в однобайтовый двоичный файл с неуважением к кодированию?

1 ответ

Решение

Проблема заключалась в том, что в UTF-8 есть некоторые представления одного и того же символа, называемые "не-кратчайшие" формы. Эти символы могут быть преобразованы математически, но iconv считает их ошибочными и не преобразует.

Я сделал короткую функцию, которая преобразует текст любого символа utf-8 в массив кодовых точек Unicode (UTF-16). А затем переназначить некоторые не-ASCII-значения в ASCII с помощью простой таблицы (например, 0x20ac совпадает с 0x80 и т. Д.). Вы можете найти полный код и таблицу переназначения здесь: Преобразование UTF-8 с кратчайшими символами в однобайтовую кодировку

Другие вопросы по тегам