我认为这将是一个简单的Web表单,直到人们开始将包含utf8字符的维基百科中的文本字符串复制并粘贴到输入字段中。我的perl CGI脚本打开MySQL DB连接并设置
<UserControl ...
Unloaded="OnUnloaded">
我正在尝试使用$DBH->{mysql_enable_utf8} = 1;
$DBH->do("set names 'utf8';");
模块对目标输入值进行解码,使用和编码,但这并不像我预期的那样工作。网页设置为utf8字符集。
在这种情况下,我的目标字符串是Encode
[从列出德国城镇名称的维基百科页面复制]。发送请求后,我可以看到目标字符串为:Baden-Württemberg
。但是,这并没有很好地贯穿我的CGI脚本。
我有以下示例脚本:
Baden-W%C3%BCrttemberg
#!/usr/local/bin/perl -w
use strict;
select(STDOUT);
$|++;
use feature 'unicode_strings';
use Encode;
use utf8;
binmode STDOUT, ":utf8";
my $thing = "Baden-Württemberg";
print STDOUT "$thing\n";
my $decodedThing = decode_utf8($thing);
print STDOUT encode_utf8($decodedThing) . "\n";
的值在'-W'之后有一个带有变音符号的'u'。
当我运行脚本时,我得到:
$thing
你好,u-umlaut去了哪里?我如何取回它?
答案 0 :(得分:3)
你告诉Perl你的源文件是用UTF-8编码的。
use utf8;
不是。 ü
在您的文件中由FC
代替C3 BC
代表。 (这就是为什么你得到这个&#34;格式不正确的消息。)修复源文件的编码。
mv file.pl file.pl~ && piconv -f iso-8859-1 -t UTF-8 file.pl~ >file.pl
以下内容毫无意义:
my $decodedThing = decode_utf8($thing);
由于use utf8;
,$thing
已经被解码。
以下内容毫无意义:
print STDOUT encode_utf8($decodedThing);
您要求Perl自动对每个发送到STDOUT的信息进行编码,这样您就可以进行双重编码。
#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use open ':std', ':encoding(UTF-8)';
my $thing = "Baden-Württemberg";
printf "U+%v04X\n", $thing; # U+[...].0057.00FC.0072.[...]
print "$thing\n"; # Baden-Württemberg
答案 1 :(得分:2)
%C3%BC
是urlencode
的{{1}}。虽然在构建URL时可能需要它,但您不希望MySQL使用它。
ü
。请提供ü
。
我认为你不需要编码/ decode_utf8。
在./test.pl第13行出现格式错误的UTF-8字符(意外的非连续字节0x72,紧接在起始字节0xfc之后)。
表示您有十六进制SHOW CREATE TABLE
(FC
的 latin1 十六进制),但您将字符串视为utf8(&#34;意外.. &#34;)ü
是后面的72
。
底线:整个处理过程中你不是utf8(手中有字节,SET NAMES,CHARACTER SET等)。
答案 2 :(得分:0)
原来Rick James的最后一句话<div id="sq"></div>
是关键。我确实需要Encode模块,但仅适用于DB插入语句,la:
Bottom line: You are not utf8 throughout the processing (bytes in hand, SET NAMES, CHARACTER SET, etc).
谢谢大家