在C语言中将UTF-8转换为ASCII

6
我有一个简单的问题,无法在互联网上找到答案。我该如何使用标准库将UTF-8转换为ASCII(大多数带重音符号的字符转换为没有重音符号的相同字符)?我找到了大多数语言的解决方案,但特别是C语言的解决方案并不多见。
谢谢!
编辑:一些好心人评论后让我重新检查了我的需求,我夸张了。我只需要一个想法来创建一个函数,使带重音符号的字符变成没有重音符号的字符。 :)

这不在标准库中,因此您应该指定您真正需要此功能工作的平台。 - Matthew Flaschen
1
@dccarmo - Cж ҮеҮҶ并дёҚжҳҜдҫӢеҰӮPosixж ҮеҮҶгҖӮеңЁLinuxдёҠеҸҜз”ЁпјҢз”ҡиҮіиў«PosixејәеҲ¶иҰҒжұӮпјҢ并дёҚиғҪдҪҝе…¶жҲҗдёәCж ҮеҮҶеә“гҖӮ - user180247
这是否意味着要求“C标准库”是相对的,可以有不同的解释? - diogocarmo
2
@dccarmo - 如果你的意思是“一种可从C编写并受到某个标准强制规定的语言”,我认为“C标准库”是一个非常糟糕的表达方式。对于大多数事情上的粗心/混淆措辞,我可以原谅,但这个C与Posix的问题是我个人的小怒点。决定你在互联网错误之战中的特定角色很重要-这是我的角色;-) - user180247
你提到 Posix 我真的不知道它是什么。如果我不知道我在为什么而战,我就无法选边站。但无论如何,我为我的错误道歉。 :) - diogocarmo
5个回答

5
看看 libiconv。即使你坚持不使用库,你可能会从中获得灵感。

我认为这违反了“仅使用标准库”的原则。 - Billy ONeal
@Billy - 只有一个人阅读libiconv源代码(例如复制代码范围),才不需要这个。 - user180247

4
一般情况下,你不能仅使用重音字符。UTF-8覆盖的范围比重音字符更广泛。

2

由于这是一份作业,我猜测你的老师可能对UTF-8一无所知,可能还停留在20世纪80年代的“代码页”和“扩展ASCII”时代(如果你还没有这些词汇,请将它们从你的词汇表中删除)。你的老师可能希望你编写一个128字节的查找表,将CP437或Windows-1252字节范围内的128-255映射到外观相似的ASCII字母。它可能会像这样...

void strip_accents(unsigned char *dest, const unsigned char *src)
{
    static const unsigned char lut[128] = { /* mapping here */ };
    do {
        *dest++ = *src < 128 ? *src : lut[*src];
    } while (*src++);
 }

2

没有内置的方法可以做到这一点。除非您涉及高级字符,否则UTF-8和ASCII之间真的很少有区别,而这些字符无论如何都无法用ASCII表示。

如果您有特定的映射需要(例如带重音符号的a -> a),那么最好将其处理为字符串替换操作。


但是当我尝试使用 if (c == 'á') { c = 'a'; } 时,它会给出“比较始终为假,因为数据类型的范围有限”:( - diogocarmo
@dccarmo:'á' 在 C 语言中看起来像 '\0703\0120',因此这是一个常量,它比 char 类型所能容纳的更大。如果 c 是一个 char 类型,那么它永远不可能等于 'á'。它可能等于 '\0703',而你流中的下一个字符将会是 '\0120' - nategoose
@nategoose:移除那些前导零;在C语言的八进制字符转义中这是无效的。\0703\0120会被解析为\070,3,\012,0 - R.. GitHub STOP HELPING ICE
不确定是否为标准C语言,但您可以尝试使用宽字符字面量,例如L'á' - Merlyn Morgan-Graham
1
@R: 你是对的,但是我无法编辑评论。我不常使用八进制,所以弄错了。 - nategoose

2

每个像样的Unicode支持库(当然不包括标准库)都有一种以KC或KD形式分解字符串的方法,这将把变音符号从字母中分离出来,使您有机会过滤它们。但是,我不确定这是否值得追求,因为结果对于母语读者来说只是无意义的乱码,并且并非所有字母都可以分解。换句话说,这只是带有问号的垃圾。


是的,我在我的问题上夸大其词了。我只是想将带重音的字符转换为没有重音的字符。我讨厌我的老师只允许我们使用标准库和C语言来完成这个任务。如果我能只使用Python就好了。:( - diogocarmo

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