我想输出一些来自UTF-8数据库的文本到CP1252(又名Latin1)中的文件。要做到这一点,我使用Text :: Iconv,它工作正常除非要转换的字符串中的字符被分解。这是否是iconv图书馆的失败是我提出的一个问题,而且答案不明显。由于工作的iconv组成上精细的字符,该解决方案是第一个规范化我的琴弦,但我似乎无法管理做到这一点:在Perl中规范Unicode字符串
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中处理文本问题的开始,我不会期望这一点。谢谢你的帮助。
编辑:一些上下文似乎很有用。当然,我设计的例子可以通过use utf8
条款得到很多帮助。我的实际问题当然不是字符串文字。
首先我从答案中了解到,我需要了解很多有关Perl的知识。事实上,我不是一名Perl程序员,而是一名Objective-C/Cocoa程序员,他们根本就没有提到这些问题。
所以我开始读了,我发现Perl文档相当混乱,例如当它谈论本地编码与UTF-8不同时。它没有说的是如何将其转换为Mac OS X平台,其中UTF-8 是的本地编码。
在任何情况下,上下文是我的程序产生输出以文本形式的文件,可以有多种格式(包括CSV和包括UNIMARC),和几个编码(四个最频繁的幸福UTF-8,CP1252,MARC8和ISO-5426) 。用户的选择。
它从通常以UTF-8(但有时在CP1252中)编码数据的某些数据库(当前为mySQL或SQL Server)获取输入。
为什么downvote?这个问题很明显,并有示例代码。很显然,OP在许多语言中都与Unicode一样苦苦挣扎 - 就像很多人一样。有关初学者,请参见[perlunitut](http://perldoc.perl.org/perlunitut.html)和[perlunifaq](http://perldoc.perl.org/perlunifaq.html)。 – Lumi 2012-04-13 08:12:09
CP1252与拉丁-1不同。 Latin-1是ISO-8859-1。有关差异的详细信息,请参阅http://en.wikipedia.org/wiki/Windows-1252。 – 2012-04-13 10:43:35
你说得对,ISO-8859-1和CP1252并不完全相同。至于Latin1是否指定ISO-8859-1或CP1252,我不太确定。我见过两个。这里是一个红色的鲱鱼 – 2012-04-17 09:56:56