【问题标题】:How do I convert a UTF-8 string to upper case?如何将 UTF-8 字符串转换为大写?
【发布时间】:2012-03-29 16:03:41
【问题描述】:

是否有一种可移植的方式将 C 中的 UTF-8 字符串转换为大写?如果没有,Linux 的方法是什么?

【问题讨论】:

    标签: c utf-8


    【解决方案1】:

    这样做的可移植方式是使用 Unicode 感知库,例如 ICU。似乎u_strToUpper 可能是您正在寻找的功能。

    【讨论】:

    • 请注意,ICU 将要求您转换 UTF-8 -> UTF-16 -> 大写 UTF-16 -> 大写 UTF-8。 (但实际上并没有其他库可以做到这一点。)
    【解决方案2】:

    glib 有g_utf8_strup()。

    【讨论】:

    • 我确信这是正确的答案,但出于某种原因,我从运行 man g_utf8_strup 中得到了 No manual entry for g_utf8_strup,尽管运行 nm /opt/local/lib/libglib-2.0.a | grep g_utf8_strup 证明它就在那里。这实在是太愚蠢了。 FTFSF。
    • @tchrist:愚蠢是相对的;每个 glib 函数的手册页将产生 100+MB 的手册页
    • @IgnacioVazquez-Abrams:看到 未压缩的 HTML 版本有 75 MB,我不太相信你的估计。
    • @ninjalj:HTML 没有手册页那么详细。
    【解决方案3】:

    执行此操作的规范方法是使用 wchar_t - 如果您有一个宽字符字符串并使用 towlower/towupper/towctrans 和您的宽字符(如果您的语言环境设置正确,这将起作用)。所以你需要把你的 UTF-8 字符串,转换成一个宽字符的字符串,然后使用这些接受 wchar_t 的函数,然后再转换回来。

    这是一个巨大的 PITA,因此您最好使用受支持的开源 Unicode 库,例如 ICU。

    【讨论】:

    • 不,这是不正确的。不可能让它与德语文本一起工作(例如),因为 ß 的大写版本是 SS,它是两个字符。这远非唯一一个中断的例子,但却是最常见的。
    • 是的,但它是唯一一个使用 posix 标准库甚至接近正确的版本(另外我责怪最初指定字符之间 1:1 大小写映射的 Unicode 标准)。
    • @JacobB 全大写比旧的头脑简单的简单大写要好得多,我们已经知道很多年了。这就是为什么像 Java 和 Perl 这样的语言为字符串的大小写映射函数提供了完整的大小写。不要逐个代码点工作;它只是行不通。你需要整个字符串。
    • @DietrichEpp:自 2008 年以来,有一个“真正的”大写 ß:ẞ de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F#Unicode
    • @drhirsch:是的,但德国人实际上并没有这样使用它。它用于表示已经使用该事物的历史文档。如果您的程序将大写“Floß”呈现为“FLOẞ”,那么德国用户会抱怨您的程序有错误,他们是对的。此外,ß 远不是唯一一个在大写时变成多个字符的字符。
    猜你喜欢
    • 2012-02-20
    • 1970-01-01
    • 2010-10-24
    • 2013-03-02
    • 1970-01-01
    • 2013-08-20
    • 2010-09-21
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多