c++ - UTF 与字符类型

标签 c++ c unicode utf

UTF-8 和 UTF-16 是可变长度 - 可以使用超过 2 个字节。 UTF-32 使用 4 个字节。 Unicode 和 UTF 是一般概念,但我想知道它与 C/C++ 字符类型有何关系。 Windows (WinApi) 使用 2 个字节的 wchar_t。如何处理长度超过两个字节的UTF-8字符?即使在 wchar_t 为 4 个字节长的 Linux 上,我也可能会得到需要 6 个字节的 UTF-8 字符。请解释一下它是如何工作的。

最佳答案

请注意不要混淆 Unicode 代码点及其在特定编码中的表示形式。 所有 Unicode 代码点都在 0x0-0x10FFFF 范围内,这使得它们可以直接存储为 32 位数字(这就是 UTF-32 的作用) )。

UTF-8 每个代码点可以达到 6 个字节 [编辑:最终版本中实际上是 4 个字节,因此空间问题没有实际意义,但该段落的其余部分成立]因为它需要一些开销管理其可变长度 - 这就是允许许多其他代码点仅用 1 或 2 个字节进行编码的原因。但是,当您接收 一个 6 字节 UTF-8 字符并且希望将其存储到 Linux 的 32 位 wchar_t 中时,您不会将其存储为-是:您将其转换为 UTF-32,从而降低开销。与 Windows 16 位 wchar_t 的情况相同,只不过您最终可能会得到 2 个 16 位、UTF-16 编码的一半。

注意:很多Windows软件实际上使用的是UCS-2,它本质上是没有可变长度的UTF-16。这些将无法处理需要两个 UTF-16 wchar_t 的字符。

关于c++ - UTF 与字符类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58763834/

相关文章:

德尔福2010 : Writing code to assign Caption containing Unicode literal values or load unicode symbols from text file?

c# - 带参数而不是 N 前缀的 Unicode SQL 查询

c++ - typedef中synonym的含义

c++ - 如何从 C++ 中的字符串获取文件扩展名

C - 求一个数的立方根

c - 为什么指针算法在架构之间不一致?

sqlite - 修复 Unicode 字节序列

c++ - 无法使用 HTTPS 访问 gSOAP Web 服务

c++ - 调用虚函数和非虚函数的区别?

c - 如何引用变长结构