我有一个脚本,它使用Spreadsheet::XLSX模块读取xlsx文件,使用字符串插值准备消息:
$message = "this is my message in my language $xlscontents";然后使用Email::Sender::Simple通过电子邮件发送。设置了Pragma 'use utf8‘。
问题是,虽然字符串文字(使用国家字符)显示正确,但变量$xlscontents却不能正确显示:尽管变量中保存的字符串已经以UTF-8编码,但每个UTF字符都被视为一系列单独的8位字符,这些字符被单独重新编码。当然,最终的结果是垃圾。至少我是这么认为的,因为只有读入$xlscontents变量的片段被破坏了;我的语言中的文字被正确显示了。我还用十六进制查看器查看了电子邮件消息,它看起来是这样的。
我的理论是,尽管Perl知道字符串文字是UTF编码的,但它似乎认为变量是8位ASCII (或另一个8位代码),并试图在插值期间对其进行编码。我的问题是:*我如何验证这个理论?有没有一种逐字节筛选Perl变量内容的方法?*我如何通知Perl该变量已经是UTF编码的,不需要重新编码?
该脚本仅在使用屏幕消息时运行良好,但当我开始处理电子邮件时,我发现所有的文本都被破坏了。所以我打开了utf支持,从那时起,文字可以正确地显示,但变量内容却不能,很明显我还是遗漏了一些东西。
发布于 2017-03-25 17:52:27
如果有人用谷歌搜索这个问题:由于Perl有自己的内部字符串表示,为了确保字符串得到正确处理,您需要在从工作表或命令行读取字符串后对其进行解码:
$value = Encode::decode( "UTF8", ($sheet -> {Cells} [0] [0]) -> {Val} );
$value = ($sheet -> {Cells} [0] [0]) -> {Val} ); utf8::decode($value);如果文件是直接读取的,则也可以在开始时指定转换。关于Unicode还有更多的注意事项,所以最好先阅读https://perldoc.perl.org/perlunicode.html。
发布于 2017-03-23 15:47:26
您可以使用Devel::Peek查看字符串是如何“编码”的。
use Devel::Peek;
Dump( $xlscontents );将字符串的内容和内部表示形式打印到STDERR。如果它包含正确编码的ut8,但没有设置utf8标志,则可以使用
Encode::_utf8_on($xlscontents)来解决这个问题。请先阅读http://perldoc.perl.org/Encode.html#Messing-with-Perl%27s-Internals。
https://stackoverflow.com/questions/42963009
复制相似问题