我很高兴重建基于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
,或者主脚本是否足够?
感谢任何提示,
托马斯
答案 0 :(得分:4)
use utf8;
就你的i / o问题而言是一个无操作:所有它都说'把我的源代码视为utf8编码'。
对于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字符串,无法告诉如何取回原始字符串。
您应该采取的步骤:
由于此时DBI utf8处理相当不错,因此您不必在应用程序中进行太多更改。
祝你好运!罗布
答案 4 :(得分:0)
看看this。这是相当普遍但它会让你的词典直截了当,虽然许多例子都在python中,per也在那里。顺便说一句,如果你尝试在没有解码/重新编码的情况下填充latin-1(或其他)编码的东西,灾难就会随之发生。
如需更多帮助,请发布详细信息。
干杯
答案 5 :(得分:-1)
您会找到完整(且经过测试)的指南here 它没有错过任何东西; Perl,DBI和MySQL。全部都是utf8'd 我有类似的痛苦,但最终完成了所有这些。