Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Проблемы с кодировкой при получении данных.


Автор: Alagert 22.10.2009, 15:43
Всем доброго времени суток!

Выпало мне заниматься поддержкой одного решения на PHP в силу отпуска одного из сотрудников и, как водится, в это самое время полезли проблемы smile Прошу помощи. 

В целом задача выглядит следующим образом: спросить сервер по указанному урлу, получить от него ответ в виде строки текста:

Код

Track Title
Artist Name
Album Title


Распарсить ее. Все выглядит просто smile Но вылезли проблемы с кодировкой, когда в ответе есть аумляуты или русские названия. 

Собственно код:

Код

$permission_resp = trim(file_get_contents("$url"));

//checking response ecoding
print_log('Permission encoding= '.mb_detect_encoding($permission_resp));

$permission_resp_parts=explode("\n", $permission_resp);

//checking encoding of parts
for($i=0;$i<3;$i++){
  print_log("Permission resp part $i ".mb_detect_encoding($permission_resp_parts[$i]));
}

//check system encoding
print_log('Encoding= '.mb_internal_encoding());


В результате имеем следующий ответ:
Код

Permission encoding= UTF-8
Permission resp part 0 UTF-8
Permission resp part 1 ASCII
Permission resp part 2 ASCII

Encoding= ISO-8859-1


Вопрос: почему части ответа стали представляться в ASCII? Как правильно обработать эту ситуацию.

ЗЫ. В PHP нуб smile

Автор: krypt3r 23.10.2009, 06:59
Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом.

Юзайте UTF-8 only

Автор: sTa1kEr 23.10.2009, 10:01
Цитата(Alagert @  22.10.2009,  16:43 Найти цитируемый пост)
Вопрос: почему части ответа стали представляться в ASCII?

Алгоритм работы http://php.net/mb_detect_encoding следующий:
1. Функция получает порядок которому будет следовать при определении кодировки. Этот порядок можно задать при помощи http://ru.php.net/mb-detect-order или вторым параметром самой функции.
2. Берет следующую по списку кодировку и проверяет все ли символы из заданной строки валидны для этой кодировки.
2a. Если все символы валидны, то возвращает эту кодировку.
2b. Если хотя бы один символ не валиден , то идет к пункту 2.
А так как по умолчанию порядок кодировок 'ASCII, JIS, UTF-8, EUC-JP, SJIS', то эта функция для латиницы будет возвращать ASCII (т.к. http://www.ietf.org/rfc/rfc3629.txt все символы US-ASCII валидны так же и для UTF-8).

Цитата(Alagert @  22.10.2009,  16:43 Найти цитируемый пост)
Как правильно обработать эту ситуацию.

Это зависит от того, чего вы хотите добиться.

PS Мндэ. Порой в вики такую ересь понапишут =\

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)