我使用iconv库来连接从使用UTF-8的现代输入源到使用Latin1的遗留系统,即CP1252(ISO-8859-1的超集).
界面最近未能转换法语字符串"Éducation",其中"É"编码为十六进制45 CC 81.请注意,目标编码的确具有"É"字符,编码为C9.
为什么iconv无法转换为"É"?我检查过MacOS X 10.7.3提供的iconv命令行工具说它无法转换,并且PERL iconv模块也失败了.
令人费解的是,"É"字符(编码为C3 89)的预组合形式转换得很好.
这是iconv的错误还是我错过了什么?
请注意,如果我尝试从UTF-16转换(其中"É"编码为00 C9组合或00 45 03 01分解),我也会遇到同样的问题.
不幸的是,除了Mac OS X上安装的版本外,iconv确实不处理UTF-8中的分解字符.
处理Mac文件名时,可以使用带有" utf8-mac "字符集选项的iconv .它还考虑了Mac分解形式的一些特性.
但是,iconv或libiconv的非mac版本不支持此功能,我找不到Mac上使用的提供此支持的源代码.
我同意你的看法,iconv应该能够处理NFC和NFD形式的UTF8,但是在有人补充源代码之前我们必须手动检测它并在将内容传递给iconv之前处理它.
面对这个恼人的问题,我使用了Jukka建议的Perl的Unicode :: Normalize模块.
#!/usr/bin/perl
use Encode qw/decode_utf8 encode_utf8/;
use Unicode::Normalize;
while (<>) {
print encode_utf8( NFC(decode_utf8 $_) );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2218 次 |
| 最近记录: |