![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
mastercz |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Подскажите пожалуйста.
Вот решил использовать в качестве конвертера Encode вместо Iconv, потому что так и не смог заставить Iconv игнорировать ошибочные символы. Однако при конвертации из utf-8 в koi8-r с помошью from_to($string, "utf-8", "koi8-r"); получаю ошибку: Cannot decode string with wide characters ... Если я указываю: utf8_off($string); , то конвертация происходит правильно. В документации написанно что этот влаг использовать нехороше. Конвертирую хэшь массив. Как сделать конверсию правильно. заранее благодарю за ответ. |
|||
|
||||
amg |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
А попробуйте
from_to($string, "utf8", "koi8-r"); (utf8 без дефиса). Я вовсе не уверен, но вдруг поможет. |
|||
|
||||
mastercz |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Не получаеться, к сожалению.
Ругаеться : Cannot decode string with wide characters at ... Вот пример:
запись
аналогична
нестал в примере переделывать .... Так вот если беру хэш из XML то: Cannot decode string with wide characters at /usr/lib.... Если сроздаю хэш внутри файла
то все работает. |
||||||||||
|
|||||||||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
это вам надо разбираться с XML::Simple, он перекодирует внутри себя в utf8, возможно не выставляя utf8_on у строки.
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
mastercz, покажите результат
до перекодировки $string. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
mastercz |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
2->arto
В том-то и дело, что как я говорил в первом посте с принудительным utf8_off($string); проблем не возникает. 2->ginnie Вот результат Devel::Peek::Dump($string); : SV = RV(0x875846c) at 0x874c9f8 REFCNT = 1 FLAGS = (PADBUSY,PADMY,ROK) RV = 0x89773a8 SV = PVHV(0x88bb458) at 0x89773a8 REFCNT = 1 FLAGS = (SHAREKEYS,HASKFLAGS) UV = 2 NV = 0 ARRAY = 0x8960080 (0:6, 1:2) hash quality = 125.0% KEYS = 2 FILL = 2 MAX = 7 RITER = -1 EITER = 0x0 Elt "xmlns:sql" [UTF8 "xmlns:sql"] HASH = 0xf73e3669 SV = PV(0x89733fc) at 0x89773b4 REFCNT = 1 FLAGS = (POK,pPOK,UTF8) PV = 0x8972f00 "urn:schemas-microsoft-com:xml-sql"\0 [UTF8 "urn:schemas-microsoft-com:xml-sql"] CUR = 33 LEN = 34 Elt "row" [UTF8 "row"] HASH = 0x2f64eb8b SV = PV(0x8973438) at 0x89b0c88 REFCNT = 1 FLAGS = (ROK) RV = 0x8977474 SV = PVHV(0x88bb488) at 0x8977474 REFCNT = 1 FLAGS = (SHAREKEYS,HASKFLAGS) UV = 4 NV = 0 ARRAY = 0x896ae68 (0:5, 1:2, 2:1) hash quality = 91.7% KEYS = 4 FILL = 3 MAX = 7 RITER = -1 EITER = 0x0 Elt "ID" [UTF8 "ID"] HASH = 0x9d86e860 SV = PV(0x895829c) at 0x8977480 REFCNT = 1 FLAGS = (POK,pPOK,UTF8) PV = 0x895fd30 "24F68470-8787-4780-93B6-DBDAA07FC2FC"\0 [UTF8 "24F68470-8787-4780-93B6-DBDAA07FC2FC"] CUR = 36 LEN = 37 PV = 0x8977474 "" CUR = 0 LEN = 0 Это сообщение отредактировал(а) mastercz - 3.9.2009, 01:27 |
|||
|
||||
ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
mastercz, я всегда считал, что $string должен быть скаляром, а не ссылкой на хэш, как у Вас.
Воспроизвел Вашу ошибку:
корректный вариант такой
т.е. Вам надо использовать
Это сообщение отредактировал(а) ginnie - 3.9.2009, 10:04 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
mastercz |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
ginnie, благодарю за помошь.
Оказывается я еще не понимал как работает этот преобразователь, так как (видимо по скудоумию) не читаю man по модулю. Если я теперь правильно понимаю decode - преобразует из выбраной кодировки в utf8, соответственно encode делает обратно? Благодаря твоей подсказке, все работает. Правда, меня слегка смутила фраза
как я понимаю:
Выдает SCALAR. Может быть я что-то не туда использую ? |
||||
|
|||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
mastercz, по поводу скаляра поясняю:
в первом сообщении написано from_to($string, "utf-8", "koi8-r");, из чего я сделал вывод, что $string - скаляр, поэтому попросил вывести его содержимое при помощи Devel::Peek::Dump(). Из содержимого я увидел, что $string не скаляр, а ссылка на хэш, и не может непосредственно использоваться в from_to($string, "utf-8", "koi8-r");. По поводу utf8: сообщение "Cannot decode string with wide characters ..." говорит о том, что мы пытаемся в функцию from_to() передать не последовательность байтов, а строку unicode-символов (т.е. с установленным флагом utf8). Для преобразования unicode-символов удобнее всего использовать функцию encode(). Разобраться с unicode в Perl непросто, я тоже постоянно испытываю трудности, приходится периодически перечитывать perldoc perluniintro и описание модуля Encode. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
mastercz |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Извиняюсь за еще один глупый вопрос, но возможно ли Encode научить работать с ошибочным символом ? Скажем если в koi8-r encode находить символ, которого нет в стандарте, то он его ищет ...мммм ну где нибудь еще-где его может определить пользователь с указанием во что его нужно преобразовывать?
Что-то типа koi8-r если нашелся символ chr("185") то заменить его на символ № (в кодировке cp1251). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |