PHP mb_detect_encoding()
не понимает кодировку MacRoman
. Мое приложение позволяет пользователям загружать данные в формате CSV, и мне нужно преобразовать их в UTF8, потому что пользователи не разбираются в технологиях. Я никогда не смогу заставить их всех понять, как это сделать, и контролировать их кодирование.
Вот что я делаю:
$encoding_detection_order = array('UTF-8', 'UTF-7', 'ASCII', 'ISO-8859-1', 'EUC-JP', 'SJIS', 'eucJP-win', 'SJIS-win', 'JIS', 'ISO-2022-JP', );
$encoding = mb_detect_encoding($value, $detection_order, true);
$converted_value = iconv($encoding, 'UTF-8//TRANSLIT', $value);
Это прекрасно работает в большинстве ситуаций, но если мой пользователь работает на Mac и сохраняет CSV в кодировке MacRoman
, то приведенный выше код обычно ошибочно определяет текст как ISO-8859-1
, что приводит к тому, что iconv()
производить плохой вывод.
Например, значение acnted-e в Jaimé
имеет шестнадцатеричное значение 0x8e
в MacRoman
. В ISO-8859-1
символ 0x8e
равен Ž
, и поэтому, когда я преобразую его в utf8, я просто получаю версию utf8 Ž
, когда мне нужно получить é
.
Мне нужно иметь возможность динамически отличать MacRoman
от других кодировок, чтобы правильно преобразовать его.