在C+中使用Unicode(UTF-8)+; 目前,我必须处理C++ 11(Linux环境)中的Unicode。 UTF-8用作默认编码。 我需要的任务: 替换 正则表达式 遍历UTF-8字符串。我不知道使用std::string和“for(character c:s)”是否能满足我的要求,因为每个字符都必须是unicode字符。例如ế 是一个字符,mão是一个包含3个字符的单词 子串 使用unicode字符连接子字符串或连接unicode字符 长度 修剪 读写文件

在C+中使用Unicode(UTF-8)+; 目前,我必须处理C++ 11(Linux环境)中的Unicode。 UTF-8用作默认编码。 我需要的任务: 替换 正则表达式 遍历UTF-8字符串。我不知道使用std::string和“for(character c:s)”是否能满足我的要求,因为每个字符都必须是unicode字符。例如ế 是一个字符,mão是一个包含3个字符的单词 子串 使用unicode字符连接子字符串或连接unicode字符 长度 修剪 读写文件,linux,string,c++11,unicode,utf-8,Linux,String,C++11,Unicode,Utf 8,我应该使用什么库来达到最佳效果 多谢各位。 期待尽快收到您的来信。对于regex/replace/search函数,我以前使用过PCRE。这是设计用于UTF-8字符串的。您可能能够使用STL正则表达式,但不能以任何可移植的方式。(尤其是Windows不支持UTF-8区域设置。) 如果需要支持组合标记或零宽度连接符,那么遍历UTF-8字符串比您描述的还要复杂!你写的é是一个字符,但它可能是两个Unicode码点:上面的拉丁文小写字母e+结合了尖锐的重音。如果您只是想迭代代码点,可以使用标准库中的m

我应该使用什么库来达到最佳效果

多谢各位。
期待尽快收到您的来信。

对于regex/replace/search函数,我以前使用过PCRE。这是设计用于UTF-8字符串的。您可能能够使用STL正则表达式,但不能以任何可移植的方式。(尤其是Windows不支持UTF-8区域设置。)

如果需要支持组合标记或零宽度连接符,那么遍历UTF-8字符串比您描述的还要复杂!你写的
é
是一个字符,但它可能是两个Unicode码点:上面的拉丁文小写字母e+结合了尖锐的重音。如果您只是想迭代代码点,可以使用标准库中的
mbtowc()
std::codevt::do_。如果您需要遍历graphemes,最可移植的方法是使用


常规的字符串连接应该可以工作,标准库的长度为
mblen()
。这不是完全可移植的,因为多字节编码不必是UTF-8(尽管有一组标准的转换函数)。

对于regex/replace/search函数,我以前使用过PCRE。这是设计用于UTF-8字符串的。您可能能够使用STL正则表达式,但不能以任何可移植的方式。(尤其是Windows不支持UTF-8区域设置。)

如果需要支持组合标记或零宽度连接符,那么遍历UTF-8字符串比您描述的还要复杂!你写的
é
是一个字符,但它可能是两个Unicode码点:上面的拉丁文小写字母e+结合了尖锐的重音。如果您只是想迭代代码点,可以使用标准库中的
mbtowc()
std::codevt::do_。如果您需要遍历graphemes,最可移植的方法是使用


常规的字符串连接应该可以工作,标准库的长度为
mblen()
。这不是完全可移植的,因为多字节编码不必是UTF-8(尽管有一组标准的转换函数)。

C++字符串只处理原始元素(
char
表示
std::string
wchar\u t
表示
std::wstring
char16\u t
表示
std::u16string
char32\u t
表示
std::u32string
),它们没有字符编码的概念,比如UTF-8/16/32(虽然
char16\u t
用于UTF-16,而
char32\u t
用于UTF-32),根据其值,每个Unicode码点可能使用超过1个元素。我将说a
用于(字符c:s)
循环不会处理BMP之外的Unicode字符,用于
std::string
std::u16string
。但对于
std::u32string
std::wstring
来说,当
wchar\u t
为4字节时,它会处理。对于您所要求的,您确实需要一个良好的Unicode感知库。如果您需要的话,有很多可用的库环顾四周(不要在这里问,征求建议是离题的)。非常感谢。我在问之前做了研究。我发现的3个LIB是UTF8CPP、ICU:Unicode和Boost。我不知道哪一个是最好的,还有更好的吗?“最好”是主观的。使用适合你需要的任何一个。如果你愿意,可以使用多个。“Unicode字符”是代码点。你所说的被称为用户感知的字符。或者,在你提到的三个库中,只有ICU才能够做到这一点;但是我不太清楚为什么你需要考虑GoeMe集群。你做什么样的预处理?C++字符串只处理原始元素。(
char
表示
std::string
wchar\u t
表示
std::wstring
char16\u t
表示
std::u16string
char32\u t
表示
std::u32string
),它们没有字符编码的概念,比如UTF-8/16/32(虽然
char16\u t
用于UTF-16,而
char32\u t
用于UTF-32),根据其值,每个Unicode码点可能使用超过1个元素。我将说a
用于(字符c:s)
循环不会处理BMP之外的Unicode字符,用于
std::string
std::u16string
。但对于
std::u32string
std::wstring
来说,当
wchar\u t
为4字节时,它会处理。对于您所要求的,您确实需要一个良好的Unicode感知库。如果您需要的话,有很多可用的库环顾四周(不要在这里问,征求建议是离题的)。非常感谢。我在问之前做了研究。我发现的3个LIB是UTF8CPP、ICU:Unicode和Boost。我不知道哪一个是最好的,还有更好的吗?“最好”是主观的。使用适合你需要的任何一个。如果你愿意,使用多个。”Unicode字符“是代码点。你所说的被称为用户感知的字符。或者,在你提到的三个库中,只有ICU是能够做到这一点的,但是我不太清楚为什么你需要考虑字形簇。你在做什么样的预处理?