【发布时间】:2013-03-09 13:32:54
【问题描述】:
在 C 中存储 Unicode 字符串的数据类型是否有原生支持。我正在编写一个玩具编译器并想解析 Unicode 字符串。
【问题讨论】:
-
我们是否假设您的意思是文字转义序列?
-
Unicode 在某种程度上受到“宽字符”的支持。请注意,“unicode”在不同的上下文中意味着不同的东西。例如,Microsoft 的意思是 [在大多数地方] 一组 16 位宽的受限字符,对 Unicode 的前 16 位之外的字符没有编码。 Unicode 本身是一种 32 位编码,但也有 8 位和 16 位变体,允许使用多个标记作为一个字符对整个 32 位范围进行编码,即 UTF-8 和 UTF-16。
-
@MatsPetersson:Unicode 实际上是 21 位编码,而不是 32 位。事实上,范围是 U+0000 到 U+10FFFF,所以它甚至不是完整的 21 位(将变为 0x1FFFFF)。这个范围意味着 UTF-8 永远不需要超过 4 个字节,并且 UTF-16 可以用一个高代理 16 位值 (U+D800..U+DBFF) 和一个低代理 16 位值 ( U+DC00..U+DFFF).
-
@vonbrand:不,不是。请参阅:unicode.org/faq/blocks_ranges.html,上面写着 'Q:我知道所有 Unicode 字符都是 16 位 [..]。对吗?' 和'A:绝对不是! Unicode 字符可以在从 U+0000 到 U+10FFFF 的任何代码点进行编码。用于表示这些代码点的代码单元的大小可以是 8 位(对于 UTF-8)、16 位(对于 UTF-16)或 32 位(对于 UTF-32)[参见 UTF 和 BOM]。 [...]' U+10FFFF 需要 21 位,而不是 31 位。
-
问题在哪里?
标签: c parsing unicode compiler-construction