使用boost :: locale进行Unicode字符分类

时间:2018-01-11 13:07:15

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

由于<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。

1 个答案:

答案 0 :(得分:0)

Locale包含许多本地化内容,不仅包括编码,例如:数据/时间格式,数字表示。

A1。为什么locale应该提供字符分类?你能否对中国/日本的包机进行分类?

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

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

BTW,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编码。