我认为这将是一个简单的 Web 表单,直到人们开始从维基百科复制包含 utf8 字符的文本字符串并将其粘贴到输入字段中。我的 perl CGI 脚本打开 MySQL DB 连接并设置
\n\n$DBH->{mysql_enable_utf8} = 1;\n$DBH->do("set names \'utf8\';");\nRun Code Online (Sandbox Code Playgroud)\n\n我正在尝试使用该Encode模块来解码、使用和编码目标输入值,但这并没有按我的预期工作。网页设置为utf8字符集。
在这种情况下,我的目标字符串是Baden-W\xc3\xbcrttemberg[从列出德国城镇名称的维基百科页面复制]。发送请求时,我可以看到目标字符串为:Baden-W%C3%BCrttemberg。但这并没有很好地通过我的 CGI 脚本。
我有以下示例脚本:
\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";\nRun Code Online (Sandbox Code Playgroud)\n\n该值$thing有一个“u”,在“-W”后面有一个元音变音。
当我运行脚本时,我得到:
\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\nRun Code Online (Sandbox Code Playgroud)\n\nu 变音符号去哪儿了?我该如何取回它?
\n%C3%BC是urlencode的\xc3\xbc。尽管您在构建 URL 时可能需要它,但 MySQL 并不需要它。
\xc3\x83\xc2\xbc当您将 utf8 字节存储为 latin1 列时会发生这种情况。请提供SHOW CREATE TABLE。
我认为您不需要对任何内容进行编码/解码 utf8 。
\n\n\n\n\n./test.pl 第 13 行出现格式错误的 UTF-8 字符(意外的非连续字节 0x72,紧接在起始字节 0xfc 之后)。
\n
表示您有十六进制FC(这是 的latin1十六进制\xc3\xbc),但您将字符串视为 utf8(“意外的..”), 72如下r所示。
底线:您在整个处理过程中都不是 utf8(手中的字节、设置名称、字符集等)。
\n