我想将一些来自 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 中处理文本的问题的开始,这是我没有预料到的。谢谢你的帮助。
编辑:一些上下文似乎很有用。当然,我做的例子可以通过一个use utf8
子句得到很大帮助。我的实际问题当然不是字符串文字。
首先,我从答案中意识到我需要了解很多关于 Perl 的知识。事实上,我不是 Perl 程序员,而是一个完全不会出现这些问题的 Objective-C/Cocoa 程序员。
所以我开始阅读,我发现 Perl 文档很混乱,例如当它谈到本机编码与 UTF-8 不同时。它没有说的是如何为 UTF-8是本机编码的 Mac OS X 平台翻译它。
在任何情况下,上下文都是我的程序以 texte 文件生成输出,这些文件可以具有多种格式(包括 csv 和 Unimarc)和多种编码(最常见的四种是 UTF-8、CP1252、MARC8 和 ISO-5426)。用户的选择。
它从某些数据库(当前为 mySQL 或 SQL Server)获取输入,其中数据通常以 UTF-8 编码(但有时以 CP1252 编码)。