Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Запуск php скрипта через планировщик заданий Windows. Проблемы с кодировкой. (http://forum.oszone.net/showthread.php?t=215866)

zvezda_t 17-09-2011 22:53 1755129

Запуск php скрипта через планировщик заданий Windows. Проблемы с кодировкой.
 
Всем привет!

Мне нужно парсить xml файл, полученный с сайта каждый час и данные записывать в БД.

Написала скипт на php, на сервере он работает, проблем нет.
Назначила его в задание через планировщик Windows.
Скрипт выполняется, но в БД данные записываются в неверной кодировке, вместо русских букв - абракодабра.

В xml данные в UTF-8, в БД данные в cp1251.
Перед записью данных делаю конвертацию :
PHP код:

$lastname=iconv('UTF-8''cp1251'trim($xml->{'family-name'})); 

что не так?

Sham 18-09-2011 08:18 1755235

А в Windows есть cp1251? Попробуйте 'Windows-1251'.

zvezda_t 19-09-2011 07:58 1755840

Изменила. Не помогает(

zvezda_t 19-09-2011 08:14 1755845

Сам файл php у меня в кодировке UTF-8 без BOM.
правильно?

Sham 19-09-2011 08:38 1755854

попробуйте
PHP код:

$lastname mb_convert_encoding(trim($xml->{'family-name'}), 'windows-1251''auto'); 

Определите кодировку $xml->{'family-name'} в mb_detect_encoding или визуально.

zvezda_t 19-09-2011 10:11 1755934

Получилось!!!! )))))

Только почему то ругается, что не определена кодировка, но работает.

PHP код:

$lastname iconv('UTF-8''cp866'trim($xml->{'family-name'}));
$lastname mb_convert_encoding($lastname'windows-1251''auto');
echo 
"k=".mb_detect_encoding($lastname); 

результат :
PHP Warning: mb_convert_encoding(): Unable to detect character encoding
k=



А если пишу, как Вы показали, то не ругается, но кодировка не меняется.
PHP код:

$lastname mb_convert_encoding(trim($xml->{'family-name'}), 'windows-1251''auto'); 
echo 
"k=".mb_detect_encoding($lastname); 

результат :
k=UTF-8

Sham 19-09-2011 10:25 1755941

изначально то в $xml->{'family-name'} какая кодировка?

PHP код:

echo mb_detect_encoding($xml->{'family-name'});
echo 
$xml->{'family-name'}; // смотрите пример текста 

cp866 - это вроде DOS-кодировка...

zvezda_t 19-09-2011 10:30 1755944

Оказывается дело не в том.
Если закоментировать строчки с преобразованием данных, то достаточно одного iconv.
Теперь вопрос у меня появился? А как мне данные преобразовать?

PHP код:

$lastname iconv('UTF-8''cp866'trim($anketa->{'family-name'}));

//$lastname=substr($lastname,0,40);
//$lastname=ucfirst(strtolower(trim($lastname)));
//$lastname=str_replace(".","",$lastname); 

Как так, почему я всегда в БД записывала данные в cp1251, а теперь работает и в cp866?

Цитата:

изначально то в $xml->{'family-name'} какая кодировка?
изначально UTF-8

Sham 19-09-2011 10:41 1755951

строковые функции PHP работают исходя из текущей локали
http://docs.php.net/manual/ru/function.setlocale.php
PHP код:

setlocale(LC_CTYPE,'ru_RU.CP1251'); 

либо используйте аналогичные mb_ функции с указанием кодировки текста http://docs.php.net/manual/ru/functi...strtolower.php
и http://docs.php.net/manual/ru/functi...nvert-case.php с MB_CASE_TITLE (вместо ucfirst)
внизу там примеры есть.

zvezda_t 19-09-2011 10:44 1755952

А почему я всегда в БД записывала данные в cp1251, а теперь работает и в cp866?

Sham 19-09-2011 10:48 1755956

zvezda_t, если локаль не соответствует кодировке текста, то строковые функции могут работать некорректно. Используйте mb_-функции, чтобы не зависеть от локали.

zvezda_t 19-09-2011 10:52 1755961

Цитата:

Цитата Sham
zvezda_t, если локаль не соответствует кодировке текста, то строковые функции могут работать некорректно. Используйте mb_-функции, чтобы не зависеть от локали. »

Я Вас поняла, спасибо, большое!

Мне не понятно почему в БД данные записываются корректно как в кодировке cp1251 так и в cp866. Разве так возможно?

Sham 19-09-2011 11:05 1755973

Имхо с однобайтными кодировками так и будет (поля таблицы и текста). Если кодировка поля таблицы многобайтная (UTF и тд), то однобайтный текст имхо вставится некорректно, и наоборот...


Время: 23:16.

Время: 23:16.
© OSzone.net 2001-