Perl 字符串操作和 utf8/unicode

7 R*_*eds 5 mysql perl utf-8

我认为这将是一个简单的 Web 表单,直到人们开始从维基百科复制包含 utf8 字符的文本字符串并将其粘贴到输入字段中。我的 perl CGI 脚本打开 MySQL DB 连接并设置

\n\n
$DBH->{mysql_enable_utf8} = 1;\n$DBH->do("set names \'utf8\';");\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在尝试使用该Encode模块来解码、使用和编码目标输入值,但这并没有按我的预期工作。网页设置为utf8字符集。

\n\n

在这种情况下,我的目标字符串是Baden-W\xc3\xbcrttemberg[从列出德国城镇名称的维基百科页面复制]。发送请求时,我可以看到目标字符串为:Baden-W%C3%BCrttemberg。但这并没有很好地通过我的 CGI 脚本。

\n\n

我有以下示例脚本:

\n\n
#!/usr/local/bin/perl -w\n\nuse strict;\nselect(STDOUT);\n$|++;\n\nuse feature \'unicode_strings\';\nuse Encode;\nuse utf8;\n\nbinmode STDOUT, ":utf8";\n\nmy $thing = "Baden-W\xc3\xbcrttemberg";\nprint STDOUT "$thing\\n";\n\nmy $decodedThing = decode_utf8($thing);\nprint STDOUT encode_utf8($decodedThing) . "\\n";\n
Run Code Online (Sandbox Code Playgroud)\n\n

该值$thing有一个“u”,在“-W”后面有一个元音变音。

\n\n

当我运行脚本时,我得到:

\n\n
# ./test.pl\nMalformed UTF-8 character (unexpected non-continuation byte 0x72, immediately after start byte 0xfc) at ./test.pl line 13.\nBaden-Wrttemberg\nBaden-Wrttemberg\n
Run Code Online (Sandbox Code Playgroud)\n\n

u 变音符号去哪儿了?我该如何取回它?

\n

Ric*_*mes 2

%C3%BCurlencode\xc3\xbc。尽管您在构建 URL 时可能需要它,但 MySQL 并不需要它。

\n\n

\xc3\x83\xc2\xbc当您将 utf8 字节存储为 latin1 列时会发生这种情况。请提供SHOW CREATE TABLE

\n\n

我认为您不需要对任何内容进行编码/解码 utf8 。

\n\n
\n

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

\n
\n\n

表示您有十六进制FC(这是 的latin1十六进制\xc3\xbc),但您将字符串视为 utf8(“意外的..”), 72如下r所示。

\n\n

底线:您在整个处理过程中都不是 utf8(手中的字节、设置名称、字符集等)。

\n