首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >诊断Perl处理UTF8

诊断Perl处理UTF8
EN

Stack Overflow用户
提问于 2017-03-23 05:31:09
回答 2查看 199关注 0票数 0

我有一个脚本,它使用Spreadsheet::XLSX模块读取xlsx文件,使用字符串插值准备消息:

代码语言:javascript
复制
$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支持,从那时起,文字可以正确地显示,但变量内容却不能,很明显我还是遗漏了一些东西。

EN

回答 2

Stack Overflow用户

发布于 2017-03-25 17:52:27

如果有人用谷歌搜索这个问题:由于Perl有自己的内部字符串表示,为了确保字符串得到正确处理,您需要在从工作表或命令行读取字符串后对其进行解码:

代码语言:javascript
复制
$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

票数 0
EN

Stack Overflow用户

发布于 2017-03-23 15:47:26

您可以使用Devel::Peek查看字符串是如何“编码”的。

代码语言:javascript
复制
 use Devel::Peek;
 Dump( $xlscontents );

将字符串的内容和内部表示形式打印到STDERR。如果它包含正确编码的ut8,但没有设置utf8标志,则可以使用

代码语言:javascript
复制
 Encode::_utf8_on($xlscontents)

来解决这个问题。请先阅读http://perldoc.perl.org/Encode.html#Messing-with-Perl%27s-Internals

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42963009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档