使用ICU库将UTF-8转换为ASCII

5
我有一个包含UTF-8字符的std::string。
我想将该字符串转换为最接近的ASCII字符等价物。
例如:
Łódź => Lodz
Assunção => Assuncao
Schloß => Schloss
不幸的是,ICU库非常晦涩难懂,并且我没有找到关于其使用的好文档,因此学习使用它需要花费我太多时间。而我又没有足够的时间。
有人能给个小例子吗?如何实现这个功能?
谢谢!
5个回答

4

试试这个, ucnv_convert("US-ASCII", "UTF-8", 目标, 目标大小, 源, 源大小, 错误)


提示:该函数可用于将 US-ASCII 编码转换为 UTF-8 编码。


3

我不知道 ICU 是什么,但 ICONV 可以做到这一点,而且很容易学习。只需要进行 3-4 次调用,你需要的是使用 iconvctl() 函数并设置 ICONV_SET_TRANSLITERATE 标志。


iconvctl函数似乎不是标准的iconv实现的一部分。至少我正在工作的Linux系统中没有它。 - GetFree
iconv不是标准,它是一个库。如果你没有iconvctl,那么你的系统可能存在问题:http://www.gnu.org/software/libiconv/ - shoosh
请查看此页面末尾:http://www.gnu.org/software/libiconv/documentation/libiconv/iconvctl.3.html(“符合标准”部分) - GetFree
@shoosh iconv是Unix标准的一部分,但iconvctl不是。 - bames53

1
我编写了一个回调函数,对其进行分解并执行一些替换。它可能可以实现为音译。代码在这里 decompcb.c,头文件在附近。请按以下方式将其安装到Unicode到ASCII转换器上:
ucnv_setFromUCallBack(gConverter, &UCNV_FROM_U_CALLBACK_DECOMPOSE, &status);

然后使用 gConverter 将 Unicode 转换为 ASCII


拉丁-ASCII转换器已经更新到ICU 4.6 / CLDR 1.9版本。 - Steven R. Loomis

0

这不是我擅长的领域,但如果您没有一个方便地为您完成此操作的库,则最好创建一个查找表/映射,其中包含UTF-8 -> ASCII值。即,键是UTF-8字符,值是ASCII字符序列。


很遗憾,音译比那稍微复杂一些。 - GetFree

0

ß->ss分解告诉我您想要兼容性分解。在ICU中,您需要使用Normalizer类来实现。之后,您将得到类似L'odz'的字符串。从这个字符串中,您可以简单地删除非ASCII字符。不需要ICU,普通STL就可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接