libxml & cp1251

12
Agel Nash
На сайте с 01.12.2008
Offline
61
1917

В распоряжении имеется несколько серверов: Debian, Gentoo, CentOS

Вот выдержки из phpinfo

Debian:

PHP Version 5.3.3
libXML support active
libXML Compiled Version 2.7.8
libXML Loaded Version 20708
libXML streams enabled
Gentoo:

PHP Version 5.3.3
libxmllibXML support active
libXML Compiled Version 2.7.7
libXML Loaded Version 20707
libXML streams enabled
CentOS:

PHP Version 5.2.10
libXML support active
libXML Version 2.6.26
libXML streams enabled

Занимаюсь переносом информации с Debian сервера на CentOS (администратор уговорил что CentOS это true, хотя судя по версиям ПО я этого не вижу).

На данный момент проблема в парсерах. Используется: парсер нокогири.

Примерно такой код


$html=@file_get_contents($this->url);
$temp = new nokogiri($html);
$itemInfo=$temp->get($this->options['reg_pagename'])->toArray();

echo mb_detect_encoding($itemInfo['#text']);
echo "1. ".iconv('utf-8','CP1251',$itemInfo['#text']);
echo "2. ".iconv('CP1251','utf-8',$itemInfo['#text']);
echo "3. ".iconv('CP1252','utf-8',$itemInfo['#text']);
echo "4. ".iconv('utf-8','CP1252',$itemInfo['#text']);
echo "5. ".$itemInfo['#text'];
echo "6. ".iconv('utf-8','CP1252',iconv('CP1251','utf-8',$itemInfo['#text']));

В ответ получаю следующее

ответ парсера:

UTF-8
1.
2. Бистекка в идеале
3. Ã
4. �
5. Бистекка в идеале
6.

Пробую выполнить этот же скрипт на серверах debian и gentoo получаю

Ответ от Debian и Gentoo серверов:

1. �������� � ������
2. Бистекка в идеале
3. БиÑ
4.
5. Бистекка в идеале
6.

Итого в 5 варианте без преобразований читабельный текст.

На страницах кодировка utf-8 (страница куда выводится результат и страницу от куда берутся данные).

Думал дело в локале. Но нет... На Debian вообще нет русских локализаций locale -a | grep ru. В phpinfo флаг default_charset везде стоит в no value.

Кто возьмется решить данную проблему?

Я (http://agel-nash.ru) - вильгельм "ЗАКОЛЕБАТЕЛЬ" Аудит безопасности MODX сайтов (/ru/forum/783778) | Обучение созданию сайтов (http://modcoach.info/)
Jake Foley
На сайте с 16.08.2008
Offline
151
#1

Это не поможет?

$output = iconv( 'UTF-8', 'windows-1251', $output );
return $output;

Я так сделал тут /ru/forum/609716 и получилось

Agel Nash
На сайте с 01.12.2008
Offline
61
#2

В ответ пустая строка. так же как и при iconv('utf-8','CP1251',$itemInfo['#text']);

На CentOS обновили php до версии 5.3.6 Проблема осталась.

Выполнил комманду pcretest -C

Debian:

PCRE version 8.02 2010-03-19
Compiled with
UTF-8 support
Unicode properties support
Newline sequence is LF
\R matches all Unicode newlines
Internal link size = 2
POSIX malloc threshold = 10
Default match limit = 10000000
Default recursion depth limit = 10000000
Match recursion uses stack
CentOS:

PCRE version 6.6 06-Feb-2006
Compiled with
UTF-8 support
Unicode properties support
Newline character is LF
Internal link size = 2
POSIX malloc threshold = 10
Default match limit = 10000000
Default recursion depth limit = 10000000
Match recursion uses stack
iamsens
На сайте с 26.08.2009
Offline
115
#3

перед строкой echo mb_detect_encoding($itemInfo['#text']);

допишите echo $itemInfo['#text'];

интерсено глянуть какая-то всё таки входящая кодировка

и дайте ссылки на phpinfo(); серверов

Agel Nash
На сайте с 01.12.2008
Offline
61
#4
iamsens:
перед строкой echo mb_detect_encoding($itemInfo['#text']);
допишите echo $itemInfo['#text']; интерсено глянуть какая-то всё таки входящая кодировка

Вариант 5.

iamsens:
и дайте ссылки на phpinfo(); серверов

тут были ссылки на phpinfo

iamsens
На сайте с 26.08.2009
Offline
115
#5

строка какая-то неправильная 5. Бистекка в идеале

екка в идеале -вот эта часть нормальная

Бист а эта - хз какая кодировка

как получается эта строка?

Agel Nash
На сайте с 01.12.2008
Offline
61
#6

В общем решение для CentOS найдено: utf8_decode

В случае с Debian и Gentoo то использовать utf8_decode не нужно, т.к. результат получается вида ?????? ??????? ??????.

Остался вопрос. Как узнать когда нужно utf_decode, а когда нет. не разные же ветки скрипта вести...

iamsens
На сайте с 26.08.2009
Offline
115
#7
Agel Nash:
В общем решение для CentOS найдено: utf8_decode
В случае с Debian и Gentoo то использовать utf8_decode не нужно, т.к. результат получается вида ?????? ??????? ??????.
Остался вопрос. Как узнать когда нужно utf_decode, а когда нет. не разные же ветки скрипта вести...

попробуйте еще скопировать php.ini (со всеми подключаемыми файлами) на новый сервер и проверить еще раз

php, не важно какая ОС, должно работать везде одинаково

Agel Nash
На сайте с 01.12.2008
Offline
61
#8

Проверил работу скрипта на других серверах CentOS - аналогичная проблема.

iamsens
На сайте с 26.08.2009
Offline
115
#9
Agel Nash:
Проверил работу скрипта на других серверах CentOS - аналогичная проблема.

php.ini копировал?

Agel Nash
На сайте с 01.12.2008
Offline
61
#10
iamsens:
php.ini копировал?

Нет. Не копировал. Там серьезные сайты крутятся поэтому рисковать не стал...

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий