gpt4 book ai didi

unicode - 为什么iconv可以转换 "É"的预组合形式而不是分解形式(从UTF-8到CP1252)

转载 作者:行者123 更新时间:2023-12-04 04:18:49 33 4
gpt4 key购买 nike

我使用 iconv 库将使用 UTF-8 的现代输入源连接到使用 Latin1 的旧系统,即 CP1252(ISO-8859-1 的超集)。

该接口(interface)最近未能转换法语字符串“É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 分解),我也会遇到同样的问题。

最佳答案

不幸的是 iconv 确实不处理 UTF-8 中的分解字符,除了安装在 Mac OS X 上的版本。

处理 Mac 文件名时,可以使用带有“ utf8-mac ”字符集选项的 iconv。也考虑到几个idiosyncrasies of the Mac decomposed form .

但是,iconv 或 libiconv 的非 Mac 版本不支持此功能,我找不到 Mac 上使用的提供此支持的源。

我同意你的观点,iconv 应该能够处理 UTF8 的 NFC 和 NFD 形式,但在有人修补源之前,我们必须手动检测并处理它,然后再将内容传递给 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 $_) );
}

关于unicode - 为什么iconv可以转换 "É"的预组合形式而不是分解形式(从UTF-8到CP1252),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9892897/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com