在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是能够做到这一点的,但是我不太清楚为什么你需要考虑字形簇。你在做什么样的预处理?