PDA

Показать полную графическую версию : Запуск php скрипта через планировщик заданий Windows. Проблемы с кодировкой.


zvezda_t
17-09-2011, 22:53
Всем привет!

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

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

В xml данные в UTF-8, в БД данные в cp1251.
Перед записью данных делаю конвертацию :
$lastname=iconv('UTF-8', 'cp1251', trim($xml->{'family-name'}));

что не так?

Sham
18-09-2011, 08:18
А в Windows есть cp1251? Попробуйте 'Windows-1251'.

zvezda_t
19-09-2011, 07:58
Изменила. Не помогает(

zvezda_t
19-09-2011, 08:14
Сам файл php у меня в кодировке UTF-8 без BOM.
правильно?

Sham
19-09-2011, 08:38
попробуйте $lastname = mb_convert_encoding(trim($xml->{'family-name'}), 'windows-1251', 'auto');
Определите кодировку $xml->{'family-name'} в mb_detect_encoding (http://docs.php.net/manual/en/function.mb-detect-encoding.php) или визуально.

zvezda_t
19-09-2011, 10:11
Получилось!!!! )))))

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

$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=


А если пишу, как Вы показали, то не ругается, но кодировка не меняется.
$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
изначально то в $xml->{'family-name'} какая кодировка?

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

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

zvezda_t
19-09-2011, 10:30
Оказывается дело не в том.
Если закоментировать строчки с преобразованием данных, то достаточно одного iconv.
Теперь вопрос у меня появился? А как мне данные преобразовать?

$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
строковые функции PHP работают исходя из текущей локали
http://docs.php.net/manual/ru/function.setlocale.php
setlocale(LC_CTYPE,'ru_RU.CP1251');
либо используйте аналогичные mb_ функции с указанием кодировки текста http://docs.php.net/manual/ru/function.mb-strtolower.php
и http://docs.php.net/manual/ru/function.mb-convert-case.php с MB_CASE_TITLE (вместо ucfirst)
внизу там примеры есть.

zvezda_t
19-09-2011, 10:44
А почему я всегда в БД записывала данные в cp1251, а теперь работает и в cp866?

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

zvezda_t
19-09-2011, 10:52
zvezda_t, если локаль не соответствует кодировке текста, то строковые функции могут работать некорректно. Используйте mb_-функции, чтобы не зависеть от локали. »
Я Вас поняла, спасибо, большое!

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

Sham
19-09-2011, 11:05
Имхо с однобайтными кодировками так и будет (поля таблицы и текста). Если кодировка поля таблицы многобайтная (UTF и тд), то однобайтный текст имхо вставится некорректно, и наоборот...




© OSzone.net 2001-2012