. net字符串.长度属性返回?代理中立长度或完整字符长度

本文关键字:字符 字符串 属性 返回 net 代理 | 更新日期: 2023-09-27 17:49:59

VS 2008和VS 2010的文档和语言不同:


VS 2008文档

在内部,文本存储为一个Char对象的只读集合,每个Char对象代表一个用UTF-16. ...编码的Unicode字符字符串的长度表示字符的数量,而不管这些字符是否由Unicode代理对组成。要访问字符串中的单个Unicode码点,请使用StringInfo对象。——http://msdn.microsoft.com/en-us/library/ms228362%28v=vs.90%29.aspx


VS 2010 Documentation

在内部,文本存储为,一个Char对象. ...的顺序只读集合字符串的Length属性表示它包含的Char对象的数量,而不是Unicode字符的数量。要访问字符串中的单个Unicode码点,请使用StringInfo对象。——http://msdn.microsoft.com/en-us/library/ms228362%28v=VS.100%29.aspx

在这两种情况下使用的语言都没有明确区分"字符"、"Unicode字符"、"Char类"、"Unicode代理对"answers"Unicode码点"。

VS2008文档中的语言声明"字符串表示字符的数量,而不管字符是否由Unicode代理对组成"似乎将"字符"定义为可能是Unicode代理对结果的对象,这表明它可能表示4字节序列而不是2字节序列。它还在开始时特别指出,一个"char"对象是用UTF-16编码的,这表明它可以代表一个代理对(是4字节而不是2)。我相当确定这是错误的,虽然。

VS2010文档更精确一些。它区分了"char"answers"Unicode字符",但没有区分"Unicode字符"answers"Unicode码点"。如果一个代码点指的是代理字符对的一半,而一个"Unicode字符"代表一个完整的代理字符对,那么"Char"类命名不正确,并且根本不指"Unicode字符"(他们声明不是),它实际上是一个Unicode代码点。

那么下面两个陈述都是正确的吗?(是的,我想。)

  1. 字符串。Length表示Unicode码点长度,
  2. 字符串。Length既不代表Unicode字符长度,也不代表我们认为的真正字符长度(要显示的字符数),而是代表"Char"对象的数量,每个对象代表一个Unicode码点(不是Unicode字符)。

. net字符串.长度属性返回?代理中立长度或完整字符长度

字符串。长度不考虑代理对;但是, StringInfo.LengthInTextElements 方法可以。

StringInfo.SubstringByTextElements 类似String。子字符串,但它对"文本元素"进行操作,例如代理对和组合字符,以及普通字符。这两个方法的功能都基于StringInfo。ParseCombiningCharacters方法,它提取每个文本元素的起始索引,并将它们存储在一个私有数组中。

" .NET框架将文本元素定义为文本的单元显示为单个字符,即字素。文本元素可以是基字符、代理字符对还是组合字符序列。"——http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx

String。长度不考虑代理对,它只计算UTF-16字符(即字符总是 2字节)-代理对计数为2个字符。

我认为两者都为假。第二个问题是正确的,如果你问的是unicode码点的数量,但你问的是"长度"。字符串的长度是它的单词元素的数量。为了防止字符串中只有来自BMP(基本多语言平面)的unicode码点,长度等于unicode字符/码点的数量。如果有来自BMP之外的码点或孤立代理(不显示为有序对的高代理或低代理),则长度不等于字符/码点的数量。

首先,String是一组单词、单词列表、单词数组或单词流。它的内容是16位字,仅此而已。将元素命名为"char"或"wchar"对于unicode字符来说是一种罪过。因为unicode字符可以有大于0xFFFF的码点,它不能存储在16位宽的类型中,如果这种类型被称为char或wchar,那就更糟了,因为它只能保存限制在0xFFFF的码点,这符合unicode 1.0标准,现在已经有20年了。为了在单个数据类型中存储最高可能的unicode码点,该类型应该有21位,但没有这样的类型,所以我们使用32位类型。事实上,有一个静态方法(char类的!)叫做ConvertToUtf32(),它就是这样做的,它可以返回一个低ASCII码点,甚至是最高的unicode码点,后者意味着这个方法可以检测到字符串位置内的代理对。