Perl字符串操作和utf8 / unicode

时间:2015-05-01 16:22:39

标签: mysql perl utf-8

我认为这将是一个简单的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去了哪里?我如何取回它?

3 个答案:

答案 0 :(得分:3)

问题1

你告诉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

问题2

以下内容毫无意义:

my $decodedThing = decode_utf8($thing);

由于use utf8;$thing已经被解码。

问题3

以下内容毫无意义:

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%BCurlencode的{​​{1}}。虽然在构建URL时可能需要它,但您不希望MySQL使用它。

当你将utf8字节存储为latin1列时,就会发生

ü。请提供ü

我认为你不需要编码/ decode_utf8。

  

在./test.pl第13行出现格式错误的UTF-8字符(意外的非连续字节0x72,紧接在起始字节0xfc之后)。

表示您有十六进制SHOW CREATE TABLEFC 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).

谢谢大家