【问题标题】:Working with UTF-8 strings and characters in C++ [closed]在 C++ 中使用 UTF-8 字符串和字符 [关闭]
【发布时间】:2018-10-21 18:58:19
【问题描述】:

我正在开发一个逐个字符处理 utf-8 字符串的项目,但是我无法找到在 C++ 中以这种方式处理 UTF-8 字符串的方法。

我需要的是:

  • 字符串必须是 UTF-8,因为字符串不限于英文字母。
  • 按原样存储和检索它们是不够的,因为我将逐个字符地处理它们。
  • 要求逐个字符地访问它们,并且能够将它们与其他 UTF-8 字符进行比较。

非常欢迎对任何 C++(不管 98/11/14)特性或库提出建议。

不使用 Boost 的附加点。我倾向于开发没有外部依赖的工具。

【问题讨论】:

标签: c++ text utf


【解决方案1】:

C++ 因开箱即用对 unicode 的支持非常差而臭名昭著。所以最好的选择是使用像 ICU 或 boost 这样的库。

友情提示:

我倾向于开发没有外部依赖的工具

您需要证明此声明的合理性,否则,如果这是您的任意规则,您就会限制自己。图书馆就像语言一样是工具。选择要使用的工具需要进行分析,并权衡利弊。

【讨论】:

  • 感谢您的建议!由于各种原因,我喜欢使用可以完全嵌入到源代码树中的库。首先,它消除了安装大型库的开发包的负担,只是为了编译(我的)一个小实用程序,然后它消除了代码维护的负担,以随着库的发展保持库的兼容性。最后,它使该工具更具可移植性,因为我并不总是可以安装大量开发包来编译我的工具。但是,最好的方法是使用 boost 或其他所谓的大库,我会很乐意在一天结束时使用它
  • @bayindirh 您现在可以使用 vcpkg (github.com/Microsoft/vcpkg) 来构建和集成几乎所有主要的 C++ 库。它已经获得了很大的吸引力,对于使用第三方库的快速原型制作和企业场景(参见他们的export 命令)同样适用
  • @bayindirh 坚实的论据。如果您知道自己在做什么,看起来像您在做什么,那么您是唯一能够判断自己实施 utf8 支持是否值得的评委。
  • @bolov,谢谢。我会看看<codecvt>libICU 等,如果我能找到一个可嵌入的库(如eigeneasylogging++ 等),我会毫不犹豫地使用它。这是一个个人项目,所以没有时间压力。我会努力在挑战、非发明和实用主义之间取得健康的平衡。
【解决方案2】:

您的意思是,使用代码点(而不是实际的 chars - 即字节)?对上述答案的一个小补充。我建议你先阅读specs on how UTF-8 works,然后可能阅读"UTF-8 Everywhere" manifesto,还有look here – it is a nice example of how to build a UTF-8 code point iterator。了解事物的实际工作原理总是一件好事,尤其是当它是您软件的重要组成部分时。虽然你肯定会最终使用 ICU :-)

【讨论】:

  • 实际上我需要访问字符本身。我要处理的文本保证有两个字节的 unicode 字符,我需要在不看到它们不同字节的情况下访问它们。由于 C++ 可以在 std::string 中存储和读取 unicode 字符串,因此通过在内部划分字节并对这些二进制值表现得无关紧要,我使用 code points 明确指出我需要访问两字节字符为字符本身,而不是这些两字节字符的单个字节。
  • 是的,对不起,我明白你的意思,只是表达得不太好。通过实际字符我的意思是chars – 字节值。编辑了答案。
【解决方案3】:

您可以使用Wide Chars(或Multibytes)来处理Unicode

https://www.geeksforgeeks.org/wide-char-and-library-functions-in-c/中总结了Wide Chars的C++库函数

另请参阅 国际化标准,例如 I18N 和 cf https://www.cprogramming.com/tutorial/unicode.html

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2023-03-27
    • 1970-01-01
    • 2016-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多