我本以为这只是一个简单的网页表单,但是当用户复制粘贴维基百科中包含UTF8字符的文本字符串到输入框时,问题就出现了。我的Perl CGI脚本打开了一个MySQL数据库连接并设置了
$DBH->{mysql_enable_utf8} = 1;
$DBH->do("set names 'utf8';");
我正在尝试使用Encode
模块对目标输入值进行解码、使用和编码,但效果不如预期。该网页设置了 utf8 字符集。
我的目标字符串是Baden-Württemberg
[从列出德国城镇名称的维基百科页面复制而来]。当请求发送时,我可以看到目标字符串为:Baden-W%C3%BCrttemberg
。然而,它在我的 CGI 脚本中未能良好传递。
我有以下示例脚本:
#!/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";
$thing
的值在“-W”后面刚好有一个带分音符号的'u'。
当我运行脚本时,会得到以下输出:
# ./test.pl
Malformed UTF-8 character (unexpected non-continuation byte 0x72, immediately after start byte 0xfc) at ./test.pl line 13.
Baden-Wrttemberg
Baden-Wrttemberg
u 音标上的两个点去哪了?我该如何恢复它?
nameTokens
(id
int(11) unsigned NOT NULL AUTO_INCREMENT,token
varchar(128) NOT NULL, PRIMARY KEY (id
), UNIQUE KEYtoken
(token
) ) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=utf8 - 7 Reeds