Показать полную графическую версию : Запуск 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'}));
что не так?
А в Windows есть cp1251? Попробуйте 'Windows-1251'.
zvezda_t
19-09-2011, 07:58
Изменила. Не помогает(
zvezda_t
19-09-2011, 08:14
Сам файл php у меня в кодировке UTF-8 без BOM.
правильно?
попробуйте $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
изначально то в $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
строковые функции 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?
zvezda_t, если локаль не соответствует кодировке текста, то строковые функции могут работать некорректно. Используйте mb_-функции, чтобы не зависеть от локали.
zvezda_t
19-09-2011, 10:52
zvezda_t, если локаль не соответствует кодировке текста, то строковые функции могут работать некорректно. Используйте mb_-функции, чтобы не зависеть от локали. »
Я Вас поняла, спасибо, большое!
Мне не понятно почему в БД данные записываются корректно как в кодировке cp1251 так и в cp866. Разве так возможно?
Имхо с однобайтными кодировками так и будет (поля таблицы и текста). Если кодировка поля таблицы многобайтная (UTF и тд), то однобайтный текст имхо вставится некорректно, и наоборот...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.