Perl UTF8 CGI и DBI ... каков правильный рабочий процесс? - PullRequest
4 голосов
/ 13 января 2011

Я с удовольствием перестраиваю основанный на Perl веб-фреймворк на поддержку UTF8. Я предпринял следующие шаги

для основного скрипта:
use open IO => ":utf8",":std";
use utf8;

для адаптера DBI:
$self->{dbh}->{'mysql_enable_utf8'} = 1;'

и в моем парсере запросов для POST и GET на основе CGI:
foreach (@val) { $_ = decode("UTF-8",$_); }

Насколько я могу судить, это прекрасно работает на моем локальном Ubuntu с Perl 5.10.1, но на веб-сервере с 5.10 декодирование POST или GET приведет к путанице в тексте.

Должен признаться, меня очень смущает все это в UTF8. Мне нужно
Читать шаблоны
Получить данные из mySQL
Процесс POST и GET вставить в MySQL
написать шаблоны

Есть что-нибудь, что я здесь забыл? Что может вызвать непостоянное поведение? Каждый ли модуль, который я использую в основном скрипте, должен специально use utf8 или достаточно, если это делает основной скрипт?

Спасибо за любые подсказки,
томас

Ответы [ 6 ]

4 голосов
/ 13 января 2011

use utf8; - это, как говорили несколько человек, запрет на работу с вашими проблемами ввода-вывода: все, что он говорит, - это «обрабатывать мой исходный код как кодированный utf8».

Подход MySQL / DBI - это деньги.

Для CGI обновите до недавнего CGI и установите $CGI::PARAM_UTF8=1, и он сделает для вас decode(). (В общем, кстати, decode_utf8() значительно быстрее!)

Что касается другой проблемы, вы можете сравнить конфигурации вашего сервера Apache, чтобы увидеть, установлено ли для AddDefaultCharset какое-либо бесполезное значение.

Кроме того, см. мой доклад на прошлогодней лондонской семинаре по Perl для более подробного изучения Perl и Unicode.

2 голосов
/ 25 мая 2012

Решение здесь - заказ

1 голос
/ 14 января 2011

Томас,

С риском дополнительных негативных моментов, я не знаю, нужно ли это по-прежнему, но в прошлом мне нужно было убедиться, что мой DBI работал правильно с utf8, выполнив:

my $ dbh = DBI-> connect (...); $ dbh -> {mysql_enable_utf8} = 1; $ dbh-> do ("установить имена 'utf8';");

Может быть, это может помочь

0 голосов
/ 17 июля 2012

Вы найдете полное (и проверенное) руководство здесь .
Это ничего не пропускает; Perl, DBI и MySQL. Все utf8'd.
У меня была похожая боль, но в конце концов все было сделано.

0 голосов
/ 13 января 2011

Посмотрите на это .Он довольно общий, но он поможет вам понять ваш лексикон, и хотя многие примеры есть в python, per также там есть.Кстати, если вы попытаетесь заполнить кодированные латиницей 1 (или другие) вещи без декодирования / перекодирования, произойдет катастрофа.

Для получения дополнительной помощи, опишите особенности.

0 голосов
/ 13 января 2011

Прежде всего мои соболезнования по поводу вашей работы на латыни -> utf8.Я сделал это для большого приложения несколько лет назад, и морщины, которые он получил, все еще не стерлись.

То, что я рекомендую вам сделать, это превратить все в UTF8, а не пытаться делать декодирование и прочее.Это определенно будет где-то облажаться.Хранение данных utf8 в латинской таблице - это путь к катастрофе.Я помню, как однажды в моей базе данных были строки utf8 с двойным и тройным кодированием, и я никак не мог сказать, как вернуть исходную строку.

Шаги, которые вы должны предпринять:

  1. Создать вторичную структуру базы данных с сопоставленной таблицей UTF8 вместо латинской
  2. извлечь все из вашей первичной базы данных и вставить вновая база данных (надеясь, что вы еще не сохранили там строки utf8)
  3. убедитесь, что заголовки Mime, которые ваше приложение отправляет браузеру, задают кодировку в utf8, все данные, которые вы возвращаете с этих страниц, автоматически принимаюткодирование самой страницы
  4. скрестить пальцы и взять отпуск ...

Вам не нужно много менять в своем приложении, так как обработка DBI utf8 довольно хороша вна этот раз.

Удачи!

Роб

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...