在Perl中规范化Unicode字符串
我想将一些来自UTF-8数据库的文本输出到CP1252(又名Latin1)中的文件.为此,我使用Text :: Iconv工作正常,除非要转换的字符串中的字符被分解.这是否是iconv库的失败是我提出的一个问题,答案并不明显.由于iconv在组合字符上工作正常,因此解决方案是首先规范化我的字符串,但我似乎无法做到这一点:
use strict; use warnings; use Data::Hexdumper qw(hexdump); use Unicode::Normalize; my $v = "é"; # E=U+0045 followed by combining ′=U+0301. UTF-8: 0x45CC81 print "'$v'n"; print hexdump($v); my $n = NFC $v; # should be é=U+00C9. UTF-8: 0xC389 print "'$n'n"; print hexdump($n); 但这是我得到的输出: 'é' 0x0000 : 45 CC 81 00 00 00 00 00 00 00 00 00 00 00 00 00 : E............... 'é' 0x0000 : 45 CC 81 00 00 00 00 00 00 00 00 00 00 00 00 00 : E............... 换句话说,NFC(转换为规范化形式C)功能没有做任何事情.我错过了什么吗?我在Mac OS X 10.7.3上使用Perl 5.12.3. 这只是我在Perl中处理文本问题的开始,我不会期望的.谢谢你的帮助. 编辑:一些上下文似乎很有用.当然,使用utf8子句可以帮助我做出很多有用的例子.我的实际问题当然不是字符串文字. 首先,我从答案中了解到,我需要了解很多关于Perl的知识.事实上,我不是Perl程序员,而是Objective-C/C++ocoa程序员,这些问题根本没有出现. 所以我开始读出来,并且我发现Perl文档非常混乱,例如当它谈到本机编码与UTF-8不同时.它没有说的是如何将其转换为UTF-8是本机编码的Mac OS X平台. 在任何情况下,上下文是我的程序在texte文件中产生输出,可以有几种格式(包括csv和Unimarc),以及几种编码(最常见的四种是UTF-8,CP1252,MARC8和ISO-5426).用户的选择. 它从一些数据库(目前是mySQL或SQL Server)获取其输入,其中数据通常以UTF-8编码(但有时在CP1252中). 解决方法
你缺少的是$v被设置为’E’字符和utf-8编码的组合急性重音变音符号,而不是组合急性变音符号本身.要解决这个问题,你需要做类似的事情
1)使用utf8 – 使Perl自动utf-8解码你的源代码 2)明确解码$v my $v = chr(0x45) . chr(0xCC) . chr(0x81); use Encode; $v = Encode::decode('utf-8',$v); # now $v is 0x45 0x301 3)使用chr将$v明确设置为你的意思 my $v = chr(0x45) . chr(0x301); 我不会真的推荐数字(2),但是当我不使用utf8时,我将其作为一种方式来说明你的脚本会发生什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |