在Perl中规范化Unicode字符串

前端之家收集整理的这篇文章主要介绍了在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).用户的选择.

它从一些数据库(目前是MysqLsql 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时,我将其作为一种方式来说明你的脚本会发生什么.

猜你在找的Perl相关文章