PHP: преобразовать входящую строку в UTF-8, без какой-либо информации, в какой кодировке она была - PullRequest
2 голосов
/ 04 мая 2011

У меня проблемы.

У меня есть REST API, который использует json_encode для вывода данных в формате JSON. Однако иногда данные передаются в API, который не является данными UTF-8. И поэтому при попытке вывести эти данные json_encode выдает исключение, потому что он может обрабатывать только данные UTF-8.

Что мне делать? Могу ли я как-то заставить все входящие данные быть UTF8? Это кажется трудным, потому что у меня нет информации, в какую кодировку отправляются данные.

Или я должен попытаться запустить json_encode для входящих данных и, если он не может кодировать, вернуть ошибку?

РЕДАКТИРОВАТЬ: я забыл упомянуть, что это REST API. Поэтому я получаю POST-запросы к моему API с большим количеством полей и значений.

Ответы [ 4 ]

2 голосов
/ 04 мая 2011

Вы могли бы быть в состоянии использовать mb_detect_encoding (), чтобы угадать, какую кодировку символов вы получаете, но эвристика, связанная с угадыванием кодировки символов, менее чем на 100% надежна, поэтому она все еще может не работать и, что еще хуже, вы можете исказить строку, которая была действительной.

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

   Content-Type: application/json; charset=ISO-8859-4

Если эта информация точна, вы можете использовать ее для перекодирования.

1 голос
/ 04 мая 2011

Вы можете использовать mb_detect_encoding для определения кодировки входящих данных, а затем использовать iconv для перевода данных в utf-8.

0 голосов
/ 04 мая 2011

Я предпочитаю функции mb_string.Вот пример с php.net

/* Convert internal character encoding to SJIS */
$str = mb_convert_encoding($str, "SJIS");

/* Convert EUC-JP to UTF-7 */
$str = mb_convert_encoding($str, "UTF-7", "EUC-JP");

/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");

/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
$str = mb_convert_encoding($str, "EUC-JP", "auto");
0 голосов
/ 04 мая 2011

Возможно, вы захотите проверить iconv()

iconv - конвертировать строку в запрошенную кодировку

http://www.php.net/manual/en/function.iconv.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...