Perl UTF8 CGI和DBI ......什么是正确的工作流程?

时间:2011-01-13 13:49:13

标签: mysql perl utf-8

我很高兴重建基于perl的Web框架以支持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 个答案:

答案 0 :(得分:4)

正如几个人所说,

use utf8;就你的i / o问题而言是一个无操作:所有它都说'把我的源代码视为utf8编码'。

MySQL / DBI方法很有钱。

对于CGI,更新到最近的CGI并设置$CGI::PARAM_UTF8=1,它将为您执行decode()。 (作为一般提示,BTW,decode_utf8()要快得多!)

至于其他问题,您可能希望比较Apache服务器配置,看看AddDefaultCharset是否设置为某些无用的值。

另外,请参阅my talk at last year's London Perl Workshop以了解有关Perl和Unicode的详细信息。

答案 1 :(得分:2)

这里的解决方案是订购。

$dbh->{mysql_enable_utf8} = 1;
$dbh->connect ...
$dbh->do('SET NAMES \'utf8\';') || die;

享受:)

答案 2 :(得分:1)

托马斯,

由于存在额外负面影响的风险,我不知道是否还需要这一点,但过去我需要通过以下方式确保我的DBI在utf8中正常运行:

我的$ dbh = DBI-> connect(...); $ dbh-> {mysql_enable_utf8} = 1; $ dbh-> do(“set names'utf8';”);

也许它可以提供帮助

答案 3 :(得分:0)

首先,我对你的拉丁语> utf8工作有所了解。几年前我为一个大型应用程序做了这件事,它给我带来的皱纹仍然没有消失。

我建议你做的是将所有内容都变成UTF8而不是尝试解码和填充。这肯定会搞砸到某个地方。将utf8数据存储在拉丁表中是一种灾难。我记得有一点在我的数据库中有双重和三重编码的utf8字符串,无法告诉如何取回原始字符串。

您应该采取的步骤:

  1. 使用UTF8整理表而不是拉丁语
  2. 创建辅助数据库结构
  3. 从主数据库中提取所有内容并插入到新数据库中(希望您还没有存储任何utf8字符串)
  4. 确保您的应用程序发送的Mime标头指定编码在utf8中,您从这些页面返回的所有数据都会自动采用页面本身的编码
  5. 交叉手指休假......
  6. 由于此时DBI utf8处理相当不错,因此您不必在应用程序中进行太多更改。

    祝你好运!

    罗布

答案 4 :(得分:0)

看看this。这是相当普遍但它会让你的词典直截了当,虽然许多例子都在python中,per也在那里。顺便说一句,如果你尝试在没有解码/重新编码的情况下填充latin-1(或其他)编码的东西,灾难就会随之发生。

如需更多帮助,请发布详细信息。

干杯

答案 5 :(得分:-1)

您会找到完整(且经过测试)的指南here 它没有错过任何东西; Perl,DBI和MySQL。全部都是utf8'd 我有类似的痛苦,但最终完成了所有这些。