【问题标题】:UTF-8 -> ASCII in C languageUTF-8 -> C 语言中的 ASCII
【发布时间】:2011-04-12 20:55:27
【问题描述】:

我有一个简单的问题,我在互联网上的任何地方都找不到,如何仅使用标准库在 C 中将 UTF-8 转换为 ASCII(主要是重音字符到没有重音的相同字符)?我找到了大多数语言的解决方案,但不是特别针对 C。

谢谢!

编辑:一些评论的好心人让我仔细检查了我需要什么,我夸大了。我只需要一个关于如何制作一个函数的想法:带重音的字符-> 不带重音的字符。 :)

【问题讨论】:

  • 它不在标准库中,所以你应该指定你真正需要它工作的平台。
  • @dccarmo - C 标准不是例如Posix 标准。在 Linux 上可用,甚至被 Posix 强制使用,并不能使它成为 C 标准库。
  • 那么这是否意味着要求“C 标准库”是相对的并且可以接受解释?
  • @dccarmo - 如果您的意思是“一种由 C 语言编写的可用语言,它是由 C 标准以外的某些标准规定的”,我认为“C 标准库”将是一种非常糟糕的表达方式.我可以原谅大多数事情上粗心/混乱的措辞,但是这个 C 与 Posix 的事情是个人的烦恼。重要的是要决定你在与互联网上那些错误的人的战争中的特殊角色 - 这是我的;-)
  • 在你提到它之前,我什至不知道 Posix。如果我不确切地知道自己在为什么而战,我就无法选择一方,但无论如何,我为我的错误道歉。 :)

标签: c utf-8 ascii


【解决方案1】:

看看libiconv。即使你坚持在没有库的情况下做这件事,你也可能会在那里找到灵感。

【讨论】:

  • 我认为这违反了“仅使用标准库”
  • @Billy - 如果只有一个人阅读 libiconv 源(例如复制代码范围),则不会。
【解决方案2】:

一般来说,你不能。 UTF-8 涵盖的内容远不止重音字符。

【讨论】:

    【解决方案3】:

    没有内置的方法可以做到这一点。除非您谈论的是高级字符,否则 UTF-8 和 ASCII 之间几乎没有区别,无论如何都不能用 ASCII 表示。

    如果你有一个你想要的特定映射(例如带重音符号 -> a),那么你应该将其作为字符串替换操作来处理。

    【讨论】:

    • 但是当我尝试做一个 if (c == 'á') { c = 'a';它给了我“由于数据类型范围有限,比较总是错误的”:(
    • @dccarmo: 'á' 看起来像 '\0703\0120' 到 C,所以这是一个大于 char 可以容纳的常数,所以如果 c 是一个字符,则没有办法让它永远平等。它可能等于'\0703',流中的下一个字符将是'\0120'
    • @nategoose:删除那些前导零;它们在 C 八进制字符转义中无效。 \0703\0120 被解析为\0703\0120
    • 不确定它是否是标准 C,但您可以使用宽字符文字,例如 L'á'
    • @R:你说得对,但我无法编辑评论。我不经常使用八进制,所以我把它搞砸了。
    【解决方案4】:

    每个体面的 Unicode 支持库(当然不是标准库)都有一种方法来分解 KC 或 KD 形式的字符串。它将变音符号与字母分开。让您有机会过滤掉它们。不太确定这是否值得追求,结果对母语读者来说只是胡言乱语,并不是每个字母都是可分解的。换句话说,就是带问号的垃圾。

    【讨论】:

    • 是的,我夸大了我的问题。我真的只想转换重音字符-> 没有重音的字符。我讨厌我的老师只允许我们使用标准库和 C 来执行此操作。如果我只能使用 Python。 :(
    【解决方案5】:

    由于这是家庭作业,我猜你的老师是一无所知,对 UTF-8 一无所知,并且可能停留在 1980 年代的“代码页”和“扩展 ASCII”(你应该删除的词)如果你还没有词汇量的话)。您的老师可能希望您编写一个 128 字节的查找表,将 128-255 范围内的 CP437 或 Windows-1252 字节映射到外观相似的 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++);
     }
    

    【讨论】:

      猜你喜欢
      • 2020-01-29
      • 2012-03-21
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2014-02-13
      相关资源
      最近更新 更多