Xpoint
   [напомнить пароль]

Переход на работу с UTF-8

Метки: [без меток]
[удл]
2006-08-28 14:35:02 [обр] Nikolay Kuznetsov(0/1)[досье]

Есть работающий проект - кодировка страниц всегда использовалась utf-8 и данные сохранялись в текстовых файлах, т.е. все данные хранятся в utf-8
потребовались строковые функции для русского языка lc(), substr(), chr()

что и как надо сделать с наименьшими переделками для полноценной работы с utf8 данными.

Сам сайт сделан через передачу всех запрашиваемых URI на один скрипт через mod_rewrite (может ли это повлиять на данные?), т.е. в русском варианте появятся ссылки http://site/Ссылка
и документ с именем "Ссылка" должен быть найден и загружен. Из скрипта также загружаются несколько своих модулей (обвязки для работы с файлами).

Я попробовал добавить use encoding "UTF-8"; в начало скрипта - документы перестали находиться ... (зато lc() стал корректно работать для русских :)

Для парсинга данных форм и QUERY_STRING используюется код

foreach $pair (@pairs)
{
  my($name, $value) = split(/=/, $pair);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $FORM{$name} = $value;
}

URI дешифруется так:
$uri =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

Perl 5.8.4

спустя 2 дня 4 часа [обр] Eugene Efremov(3/68)[досье]

Как насчет использования use bytes при разборе?

P.S. Поддержка Unicode

спустя 1 день 16 часов [обр] Nikolay Kuznetsov(0/1)[досье]

Статью Поддержка Unicode повесил у себя на десктоп...
Кстати, под виндовс удалось подбором прагм и вызовов процедур запустить в нормальном режиме, а вот на хостинге (линукс, перл 5.8.0) не работает. Стал смотреть - видимо проблема в хэше (у меня он используется для хранения пары ключ значение после загрузки из текстового файла и перед записью в файл). Так как в сохраненом файле может быть две строки с одинаковым ключом на русском (например, "ссылка" и "ссылка"), чего не должно быть, но после загрузки этого файла снова в хэш, поиск в хэше показывает, что такое значение не найдено.

насчет "use bytes" в каком месте именно его надо употребить?

спустя 2 часа 52 минуты [обр] Eugene Efremov(3/68)[досье]
насчет "use bytes" в каком месте именно его надо употребить?
Перед запихванием URI в регексп. Возможно это поможет. Кстати, лучше этот код вынести в отедльную ф-цию. И логировать ее работу — что было до регекспа, что стало после, как оно меняется при наличии/отсутствии use bytes и т.д...
спустя 42 минуты [обр] Nikolay Kuznetsov(0/1)[досье]
вроде поборол - заключил парсинг формы в use bytes; no bytes;
а получение значений из файлов сделал $key="".$key; $value="".$value; - конкатенация видимо помогает конвертнуть в утф8
спустя 10 дней [обр] Закиров Руслан(69/341)[досье]
  1. Поддержка Unicode (Закладка на то, что ord() возвращает значения в диапазоне 0..255)

Прагма bytes локального дествия и можно сделать так:

{ use bytes;
...делаем все с байтами...
}
  1. Поддержка Unicode (Конкатенация строк с флагом и без флага)

Лучше воспользоваться явным преобразованием с помощью функции Encode::decode_ut8.

Powered by POEM™ Engine Copyright © 2002-2005