【问题标题】:Why the SizeOf(Char) = 2 in Delphi2009+?为什么 Delphi2009+ 中 SizeOf(Char) = 2?
【发布时间】:2012-08-18 04:09:23
【问题描述】:

我想知道:SizeOf(Char) = 2 在从来没有 Delphi 版本中,但这不足以存储 unicode 表中定义的字符的所有整数映射,对吗? (据我所知,字符数超过 65536)。那么这个问题是如何解决的呢?

也许两个字节用于编码基本多语言平面 (BMP) 中的所有字符? 但是 BMP 之外的字符会发生什么?

有人能解释一下吗?

谢谢。

【问题讨论】:

  • 它们是 Windows 宽字符 (wchar_t),它是 16 位的兼容性。使用 UTF-16 编码的外部字符
  • 由于 Unicode 代理功能,您永远无法确定 BMP 中的 Unicode 字形是否会在一个 UCS4 映射字符内编码。所以使用 UTF-16 编码是没有问题的,就像 Windows 中的任何地方一样。

标签: delphi unicode character-encoding


【解决方案1】:

BMP 之外的字符串使用代理项进行编码,如在 UTF-16 中。

【讨论】:

  • Delphi 2009/2010/XE/XE2/XE3 Char = WideChar,使用 UTF-16 编码,作为 Windows API。如果你想要真正的 Unicode 进程,由于代理功能,你无论如何都需要使用字符串。
  • @Arnaud “真正的 Unicode 进程”是什么意思?最后一句话我不清楚。
  • 我已经阅读了@Serg 提供的链接,但我不明白代理的概念。如果有飞机,为什么要使用它们?
  • 如果没有代理对,您无法将所有 Unicode 空间编码为 16 位字符。
【解决方案2】:

以前,如果您想存储单个字符,您可以使用单个字符 (AnsiChar)。但是在 Unicode 中,您不应该在 Chars 中存储单个 UTF-16 代码点(在 D2009+ 中是 WideChars),您应该使用字符串,因为它们可以包含单个 Char 以及代理对。

【讨论】:

  • “以前,如果你想存储一个字符,你可以使用一个字符 (AnsiChar)。”如果您必须处理 MBCS ansi 字符串,情况并非总是如此,它可以为单个 Unicode 字符使用多个 AnsiChar 值。
猜你喜欢
  • 1970-01-01
  • 2021-12-17
  • 2018-03-05
  • 2014-05-25
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2015-08-21
  • 2013-09-24
相关资源
最近更新 更多