1

我的问题与数据库(尤其是 SQL Server)有关:在官方指南中,提到使用“NVARCHAR/NCHAR”时,使用“每个字符 2 个字节的存储空间”和“如果需要代理对,则字符将需要 4 个字节的存储空间。” 需要代理对时如何使用 4 字节?该“需要”将如何与 SQL Server 进行通信,它如何知道?我只是不确定这将如何解决——当我编程时,我要么将某些东西定义为 UTF-8、16 或 32。SQL Server 似乎只接受 UTF-16,它会以某种方式使用需要时代理对。有人可以向我解释这应该如何工作吗?另外,我真的很感谢来源和参考资料,以便我可以对此进行更多研究。

我尝试阅读有关代理对的内容,除了一些仅触及表面的来源并解释说“代理对只是使用两个 UTF-16 表示 UTF-32 字符的机制”之外,几乎没有任何内容。

非常感谢您对冗长的问题感到抱歉。

4

1 回答 1

1

好的,有时最好自己进行研究并找到答案(即使这可能需要很多天数小时)。无论如何,我找到了我的问题的答案。

简而言之,UTF-16 的前身 UCS-2 是一种 FIXED-LENGTH 编码。这意味着 UCS=-2 中的所有字符恰好占用 2 个字节。UTF-16 是在 UCS-2 之后引入的,相比之下,它是一种可变长度编码。这意味着 UTF-16 通过代理配对,将允许定义占用 32 位而不是 16 位的字符。这是如何完成的?UTF-16 编码中存在一个保留用于配对的范围。这意味着使用此范围(恰好是 1024 个点)的任何编码都被自动假定为等待一对。

因此,此时,您可能会问“如果我使用 USC-2 编码并且我的程序看到该禁止范围内的字符会发生什么”。答案很简单,“没什么”。UCS-2 没有定义该范围,这实际上是 UTF-16 和 UCS 之间的唯一区别。UCS 绑定程序根本无法识别 UTF-16 特定字符。

于 2015-03-04T19:10:12.677 回答