设为首页 收藏本站
查看: 897|回复: 0

[经验分享] Perl Unicode转换(大部分摘自网络)

[复制链接]

尚未签到

发表于 2015-12-26 14:46:23 | 显示全部楼层 |阅读模式
  Perl Unicode转换概括
  1.判断输入源的编码方式
2.输入源是utf8编码
  a. Encode::_utf8_on($str);开启utf8 flag。
 输入源非utf8编码
  a. $string = decode(ENCODING,$octets [,CHECK]);将输入源转化成utf8编码并开启utf8 flag
3.输出
  $str = Encode::encode(ENCODING, $str);把字符串从utf8编码转成指定的编码, 并关闭utf8 flag
  ----------------------------------------------以下内容摘自网络------------------------------------------------------------------------------
  Perl Internal Form
  Perl中字符串只有两种形式:一种是字符串(Perl strings)。另外一种是字节流(bytes,标准称作octets)。编码类型分别是:utf8编码(字符串)和Ascii(字节流)
  UTF8 FLAG
  perl如何确定一个字符串是octets还是utf8编码的字符串呢? perl完全是靠字符串上的utf8 flag。在perl内部, 字符串结构由两部分组成: 数据和utf8 flag
  比如字符串“中国”在perl内部的存储是这样:
  utf8 flag    数据
          On    中国
如果utf8 flag是On的话, perl则把“中国”当成utf8字符串来处理, 如果utf8 flag为Off, perl就会把他当成octets来处理。但要注意的是:不能根据utf8 flag来判定字符串是否是utf8编码。
  示例1:
use Encode;
use strict;
  my $str = "中国";
Encode::_utf8_on($str);
print length($str) . "\n";
Encode::_utf8_off($str);
print length($str) . "\n";
  运行结果是:
Malformed UTF-8 character (unexpected end of string) at unicode.pl line 30
2
6
  使用Encode模块的_utf8_on函数和_utf8_off函数来开关字符串“中国”的utf8 flag。可以看到, utf8 flag打开的时候,"中国"被当成utf8字符串处理, 其长度是2。 utf8 flag关闭的时候,“中国”被当成octets(字节数组)处理, 出来的长度是6(我的编辑器用的是utf8编码, 如果你的编辑器用的是gb2312编码, 那么长度应该是4)。由于"中国"本来的编码是gb2312的, 不是utf8的,但开启utf8 flag后,Perl把"中国"当成utf8处理,这就可能导致错误发生:Malformed UTF-8 character(unexpected end of string)
  
  字符串来源
  为了应用上面说到的基本原则, 我们首先要知道字符串本来的编码和utf8 flag开关情况, 这里我们讨论几种情况。
  1) 命令行参数和标准输入。 从命令行参数或标准输入(STDIN)来的字符串, 它的编码跟locale有关。如果你的locale是zh_CN或zh_CN.gb2312,那么进来的字符串就是gb2312编码, 如果你的locale是zh_CN.gbk, 那么进来的编码就是gbk, 如果你的编码是zh_CN.UTF8, 那进来的编码就是utf8。不管是什么编码, 进来的字符串的utf8 flag都是关闭的状态。
  2) 你的源代码里的字符串。 这要看你编写源代码时用的是什么编码。 在editplus里, 你可以通过“文件”->“另存为”查看和更改编码。在linux下, 你可以cat一个源代码文件, 如果中文正常显示, 说明源代码的编码跟locale是一致的。源代码里的字符串的utf8 flag同样是关闭的状态。  
       如果你的源代码里含有中文, 那么你最好遵循这个原则: 1) 编写代码时使用utf8编码,2)在文件的开头加上“use utf8;”语句。这样, 你源代码里的字符串就都会是utf8编码的, 并且utf8 flag也已经打开。
  3) 从文件读入。 这个毫无疑问, 你的文件是什么编码, 读进来就是什么编码了。读进来以后, utf8 flag是off状态。
  小结:不经过特殊处理,字符串的utf8 flag是off状态,perl就会把字符串当成octets来对待。这时候, 我们使用$string = decode(ENCODING, $octets) 用来解码字节流的。它按照你给出的编码格式(ENCODING)解释给定的字节流,把字节流从ENCODING编码转成utf8编码,并开启utf8 flag。不过有个例外就是, 如果字符串是仅仅ascii编码或EBCDIC编码的话, 不开启utf8 flag。注:本人尚不清楚如何判定字符串是否是ascii编码或EBCDIC编码
  输出
  字符串在程序内被正确地处理后, 要展现给用户。这时我们需要把字符串从perl internal form转化成用户能接受的形式。简单地说, 就是把字符串从utf8编码转换成输出的编码或表现界面的编码。这时候, 我们使用$str = Encode::encode('charset', $str);把字符串从utf8编码转成指定的编码, 并关闭utf8 flag。
  同样可以分为几种情况:
  1) 标准输出。标准输出的编码跟locale一致。输出的时候utf8 flag应该关闭, 不然就会出现我们前面看到的那行警告:
Wide character in print at unicode.pl line 10.
  2)。。。。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156639-1-1.html 上篇帖子: Perl默认变量== 下篇帖子: 如何用PERL设置环境变量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表