std::string 和 UTF-8 编码的 unicode
std::string and UTF-8 encoded unicode
如果我理解得很好,可以同时使用字符串和wstring来存储UTF-8文本。
- 对于字符,
ASCII 字符占用单个字节,一些中文字符占用 3 或 4,依此类推。这意味着
str[3]
不一定指向第 4 个字符。同样的事情
wchar_t
但每个字符使用的最小字节量始终为 2(而不是 1 表示char
),而 3 或 4 字节宽的字符将需要 2wchar_t
.
右?
那么,如果我想使用string::find_first_of()
或string::compare()
等与如此奇怪的编码字符串怎么办?会起作用吗?字符串类是否处理字符具有可变大小的事实?或者我应该只将它们用作虚拟的无特征字节数组,在这种情况下,我宁愿选择wchar_t[]
缓冲区。
如果std::string
不处理这个问题,第二个问题:是否有库提供可以处理 UTF-8 编码的字符串类,以便str[3]
实际上指向第 3 个字符(这将是长度从 1 到 4 的字节数组)?
你说的是Unicode。Unicode 使用 32 位来表示一个字符。但是,由于这会浪费内存,因此有更紧凑的编码。UTF-8 就是这样一种编码。它假定您使用的是字节单位,并将 Unicode 字符映射到 1、2、3 或 4 个字节。UTF-16 是另一种使用单词作为单位并将 Unicode 字符映射到 1 或 2 个单词(2 或 4 个字节)的函数。您可以同时对字符串和wchar_t使用这两种编码。 UTF-8 对于英文文本/数字往往更紧凑。
无论使用的编码和类型如何(比较),某些内容都将起作用。但是,所有需要理解一个字符的功能都将被破坏。即第 5 个字符并不总是底层数组中的第 5 个条目。它可能看起来像是在某些示例中工作,但它最终会中断。字符串::比较将起作用,但不要期望按字母顺序排序。这是依赖于语言的。字符串::find_first_of 适用于某些但不是全部。长字符串可能会起作用,因为它们很长,而较短的字符串可能会被字符对齐混淆并生成很难找到的错误。
最好的办法是找到一个为你处理它的库,并忽略下面的类型(除非你有充分的理由选择一个或另一个)。
你不能用 std::string 或标准库中的任何其他工具处理 Unicode。使用外部库,例如:http://utfcpp.sourceforge.net/
你对那些是正确的:
...这意味着 str[3] 不一定指向第 4 个字符......仅将它们用作虚拟的无特征字节数组...
C++字符串只能处理 ASCII 字符。这与 Java 字符串不同,后者可以处理 Unicode 字符。您可以将中文字符的编码结果(字节)存储为字符串(C/C++中的char只是字节),但这毫无意义,因为字符串只是将字节视为ascii字符,因此无法使用字符串函数进行处理。
wstring可能是你需要的东西。
有些事情应该澄清。UTF-8 只是 Unicode 字符的一种编码方法(将字符从/转换为字节格式)。
- 如何确定我已使用非编码文件到达 EOF?
- C++ - Unicode Newline
- 如何在 c++ 中读取用 utf-8 编码的 java unicode 字节字符串
- 读取 CSV 文件(UNICODE 编码)C++时出现编码错误
- 为什么 unicode 编码需要函数 wsetlocale()
- Windows的unicode数据类型使用什么unicode编码(UTF-8、UTF-16等)
- C/C++ 将编码设置为 UNICODE。如何将'ă'写入文件
- 这是怎麽?在读取使用 Unicode 编码的文本文件后控制台输出的开头
- 使用 Unicode 编码从 txt 文件读取 -- C++/C#
- std::string 和 UTF-8 编码的 unicode
- UTF-8 Unicode 编码和国家/地区特定字符
- unicode或任何其他编码数据是如何存储在内存中的?(win32)
- 如何在char16_t字符串文本中编码 Unicode 点 U+10000
- 从多字节编码到Unicode的转换
- 如何将Unicode字符转换为HTML编码
- 我怎么能得到QT主函数argv参数作为unicode编码格式
- c++ 11中字符串字面值的Unicode编码
- C++字符串编码UTF8 /Unicode
- 库的字符串编码是否符合Unicode或灵活
- 如何检测ICU中的一种编码是否支持unicode字符