【发布时间】:2018-01-11 13:07:15
【问题描述】:
由于来自<cctype> 和<locale> 的字符分类标准函数不能像UTF-8 这样的多字节字符编码,因此必须求助于其他实现。一个合适的库可能是 Boost.Locale(可能以 ICU 作为其后端)。不幸的是,我找不到如何逐个代码点或逐个字形迭代 UTF-8 编码的字符串代码点并将其分类为例如大写或小写、空格等。
有类似的问题没有令人满意的答案:
- Character classification
- Boost.Locale and isprint
- Why boost locale didn't provide character level rule type?
但是,正如其他答案所建议的那样,ICU 中存在低级功能:
- C++ function that tells if a unicode point is a 'letter' and not number of punctuation
- Why boost locale didn't provide character level rule type?
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