【发布时间】:2011-06-06 20:30:55
【问题描述】:
请为我澄清一下,UTF16 是如何工作的? 考虑到以下几点,我有点困惑:
- C++ 中有一个静态类型,WCHAR,
,长度为 2 个字节。 (显然总是 2 个字节长)(更新:如答案所示,这个假设是错误的)。 - 大多数 msdn 和其他一些文档似乎都假设字符总是 2 个字节长。这可能只是我的想象,我想不出任何具体的例子,但似乎就是这样。
- 在 C++ 或 Windows 中没有广泛使用的“超宽”函数或字符类型,所以我认为 UTF16 就是我们所需要的。
- 据我所知,unicode 的字符比 65535 多得多,因此它们在 2 个字节中显然没有足够的空间。
- UTF16 似乎是 UTF8 的更大版本,UTF8 字符可以有不同的长度。
所以如果一个 UTF16 字符并不总是 2 个字节长,它还能有多长? 3个字节?还是只有 2 的倍数? 然后例如,如果有一个 winapi 函数想知道宽字符串的大小(以字符为单位),并且该字符串包含 2 个字符,每个字符长 4 个字节,那么该字符串的大小是多少以字符为单位 em> 计算出来的?
是 2 个字符长还是 4 个字符长? (因为它是 8 个字节长,每个 WCHAR 是 2 个字节)
更新:现在我看到字符计数不一定是标准的东西或 c++ 的东西,所以我会在我的第二个问题中尝试更具体一点,关于“字符”的长度宽字符串:
在 Windows 上,特别是在 Winapi 中,在其宽函数(以 W 结尾)中,如何计算由 2 个 unicode 代码点组成的字符串中的字符数,每个代码点由 2 个代码单元组成(共 8 个字节) ?这样的字符串是 2 个字符长(与代码点数相同)还是 4 个字符长(与代码单元总数相同?)
或者,更通用:“宽字符串中的字符数”的 windows 定义是什么意思,代码点数或代码单元数?
【问题讨论】:
-
一个 UTF-16 编码单元总是两个字节。一个 Unicode 字符可能占用 1 或 2 个代码单元。
-
是的。 IMO UTF-16 是两全其美的:总是比 8 位编码(如 UCS-4)占用更多的空间,并且没有恒定的代码点大小(如 UTF-8)。当然,后者并不那么重要,因为组合代码点使得逻辑字符总是可以具有可变大小的表示,但前者比 UTF-8 差。
-
好的,所以回答我的第二个问题,一个由 2 个 UTF16 字符组成的字符串,其中每个字符长 4 个字节,被所有 winapiW 函数等视为 2 个字符长?
-
你可以阅读这篇好文章:joelonsoftware.com/articles/Unicode.html
-
@Cray:UTF-16(实际上是 UCS-2)在开发 Windows NT 时是一种方便的固定宽度编码。 Unicode 在 BMP 之外的扩展破坏了这一点。
标签: c++ winapi unicode utf-8 utf-16