【问题标题】:Unicode character classification with boost::locale带有 boost::locale 的 Unicode 字符分类
【发布时间】:2018-01-11 13:07:15
【问题描述】:

由于来自<cctype><locale> 的字符分类标准函数不能像UTF-8 这样的多字节字符编码,因此必须求助于其他实现。一个合适的库可能是 Boost.Locale(可能以 ICU 作为其后端)。不幸的是,我找不到如何逐个代码点或逐个字形迭代 UTF-8 编码的字符串代码点并将其分类为例如大写或小写、空格等。

有类似的问题没有令人满意的答案:

但是,正如其他答案所建议的那样,ICU 中存在低级功能:

Q1:考虑到迭代 UTF-8 编码字符串并将每个字符分类为大写或小写或空格的简单任务。如何使用 Boost.Locale 在 C++ 中实现它?

Q2:如果 Boost.Locale 无法做到,但 ICU 可以。如何使用 Boost.Locale 获得合适的值以传递给 ICU 的分类功能? ICU 通常采用 int32_t。如何通过 Boost.Locale 从 UTF-8 字符串中获取此信息?

Q3:Boost.Locale 对 UTF-8 字符串进行操作的函数通常也以语言环境作为参数。如果我不知道字符串包含哪种语言,如何传递该参数?例如。字符串可以包含独立于语言环境的英文或中文文本。 UTF-8 是否定义了独立于任何语言环境的 WSpace 之类的属性?只要是 UTF-8 语言环境,我提供的语言环境是否重要?

目标平台是 Windows。编译器是 Visual Studio 2015。

【问题讨论】:

    标签: c++ boost unicode utf-8 icu


    【解决方案1】:

    Locale 包含很多本地化的东西,不仅仅是编码,例如:数据/时间格式,数字表示。

    A1。为什么语言环境应该提供字符分类?你能分类中日包机吗?

    A2。不知道你在问什么,你可以直接给 ICU 打电话。

    A3。 UTF-8 是一种编码,而不是语言环境。有专门的语言环境,如 en_US.UTF-8、zh_CN.UTF-8 等。所有这些语言环境都使用 UTF-8 对字符进行编码。您不需要知道字符串区域设置,UTF-8 能够编码所有 unicode 字符。 Unicode 应用程序能够显示所有 unicode 字形,无论是中文、日文还是泰文。

    顺便说一句,boost regex 提供了一个 utf8 字形迭代器 http://www.boost.org/doc/libs/1_66_0/libs/regex/doc/html/boost_regex/ref/internals/uni_iter.html

    并且,请确保始终使用 Unicode 字符串、使用 Unicode API 并避免使用 Windows MBCS 编码。

    【讨论】:

    • A1:Boost.Locale 执行character conversion。但是你说Boost.Locale不能做字符分类?有没有办法用 Boost 做到这一点?例如,中文/日文确实有空间,不是吗? A2:我可以直接打电话给ICU。但它需要一个 int32_t。如何通过 Boost 从 UTF-8 字符串中获取此信息? A3:这正是我为什么需要提供语言环境让我感到困惑的原因。但是你说只要是 UTF-8 语言环境,我提供的语言环境并不重要?
    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 2020-10-12
    • 2010-11-18
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-08-02
    相关资源
    最近更新 更多