打开VS2008的MSDN: A.用索引的方式输入“String 类 ”,内容如下: String 类  表示文本,即一系列 Unicode 字符。 命名空间:  System 
程序集:  mscorlib(在 mscorlib.dll 中) 备注 
字符串中的每个 Unicode 字符都是由 Unicode 标量值定义的,Unicode 标量值也称为 Unicode 码位或者 Unicode 字符的序号(数字)值。每个码位都是使用 UTF-16 编码进行编码的,编码的每个元素的数值都用一个 Char 对象表示。 一个 Char 对象通常表示一个码位,即:Char 的数值等于该码位。但是,一个码位可能需要多个编码元素。例如,Unicode 辅助码位(代理项对)使用两个 C 
B.用索引的方式输入“String 数据类型”,内容如下: String 数据类型 (Visual Basic) 
请参见  发送反馈意见 存储 16 位(2 字节)无符号码位的序列,值的范围从 0 到 65535。每个“码位”(或字符代码)表示单个 Unicode 字符。一个字符串可包含从 0 到将近 20 亿 (2 ^ 31) 个 Unicode 字符。 Unicode 字符: 
Unicode 的前 128 个码位(0 到 127)对应于标准美国键盘上的字母和符号。这前 128 个码位与 ASCII 字符集中定义的码位相同。随后的 128 个码位(128 到 255)表示特殊字符,如拉丁字母、重音符号、货币符号以及分数。Unicode 使用其余码位 (256-65535) 表示各种符号。其中包括世界上各种文字的字符、音调符号以及数学和技术符号。

解决方案 »

  1.   

    其中,A里解释,VS2008的字符串处理是用UTF-16处理的,也就是说,无论是C#,还是VB.Net都是基于UTF-16的处理机制,一个字符可能是2Byte,也可能是4Byte,可以覆盖全世界的语言。这点大家没意见吧? 但是在B里,MS又说VB String值的范围从0到65535,这不是以前那种固定2Byte受codepage影响的编码吗?该不是MS直接抄了VB6的MSDN内容吧?C#和VB.Net的字符串处理机制应该是一样的,C#的朋友们怎么看这个问题 :)
      

  2.   

    Visual Basic不是VB.Net,Visual Basic String不是.Net String。
      

  3.   

    呵呵,可以再看看 .net framework 中对 Char 的解释:
    多数 Unicode 字符可由一个 Char 对象表示,但编码为基字符、代理项对和/或组合字符序列的字符由多个 Char 对象表示。因此,String 对象中的 Char 结构不一定与单个 Unicode 字符等效。
      

  4.   

    关键是他的这句:“存储 16 位(2 字节)无符号码位的序列,值的范围从 0 到 65535。”to gomoku:在VS2008里,VB.net还是用Visual Basic称呼,所有的代码例子前面标明的都是“Visual Basic”,旧的VB他用Visual Basic 6.0标明
      

  5.   

    还有...你引用的A段和上面我们引用的部分都是CLR类型的解释,与C#还是VB都没关系,也就是说对C#和VB都适用...至于VB部分String数据类型的描述,因为VB的定位就是使初学者更容易理解所以描述相对更简单更口语化...
      

  6.   

    to:vrhero.NET Framework 使用 Char 结构表示 Unicode 字符。Unicode 标准使用称为码位的唯一的 21 位标量数字标识每个 Unicode 字符,并定义了 UTF-16 编码格式,这一格式指定如何将码位编码为一个或多个 16 位值的序列。每个 16 位值的范围为十六进制的 0x0000 到 0xFFFF,并存储在 Char 结构中。Char 对象的值是其 16 位数字(序号)值。.NetFrame里明確提到了每個碼位可以是“1個或多個”16位值的序列(見青色),也就是你標為紅色的前面,這一點是UTF-16已經沒爭議了 =>每個碼位可以是1個或多個16位值的序列但是我們重新看下對“String 数据类型 (Visual Basic)”的描述:“存储 16 位(2 字节)无符号码位的序列,值的范围从 0 到 65535。”=>每個碼位是2Byte
    “每个“码位”(或字符代码)表示单个 Unicode 字符。”=>每個Unicode字符用1個碼位
    這兩句話合起來,就是“每個Unicode字符用2Byte”我覺得(Visual Basic)段更像是描述以前要區分GB,Big5編碼的那種Unicode,而不像是在描述UTF-16
      

  7.   

    CSDN高手很多,歡迎繼續討論,這樣有利于提高,雖然有點鉆牛角尖了,呵呵下星期一結貼
      

  8.   

    这两句话合起来怎么能得出“每個Unicode字符用2Byte”的结论?将码位编码为一个或多个 16 位值的序列存储 16 位(2 字节)无符号码位的序列自己看吧,我都懒得说了...看你用繁体字,如果你是港澳台海外同胞可以原谅,否则去复习一下中学语文...
      

  9.   

    存储 16 位(2 字节)无符号码位的序列
    纠正一下,不是这句...是下句...每个“码位”(或字符代码)表示单个 Unicode 字符
      

  10.   

    to vrhero:我知道你的意思,你所理解的“码位”依據是NetFrame里說的“码位编码为一个或多个 16 位值的序列”。但是(Visual Basic) 那段多了一句話,導致理解上模糊不清(青色的字):String 数据类型 (Visual Basic) 
    请参见  发送反馈意见 
    存储16位(2字节)无符号码位的序列,值的范围从 0 到 65535。每个“码位”(或字符代码)表示单个 Unicode 字符。把這2句壓縮一下,變成:String存储16位(2字节)无符号码位的序列。每个“码位”(或字符代码)表示单个 Unicode 字符。這里的“码位”究竟是理解成“16位(2字节)无符号”的那種,還是理解成“一个或多个16位值的序列”?按照上下文理解,自然是前者,如果讓我來描述,可能會改成下面的:存储16位(2字节)或者32位(4字節)无符号码位的序列,大部分文字的范围从0到65535,少量文字的值大于65535。每个“码位”(或字符代码)表示单个 Unicode 字符。或者:
    VB的碼位是一个或多个16位值,每个“码位”(或字符代码)表示单个 Unicode 字符。是不是就沒歧義了?這才容易讓人聯想到UTF-16
      

  11.   

    也感謝vrhero的熱心幫助,和大家的up另:我是大陸的,因公司是澳門合資,所以我們這邊都是用繁體版的xp :-)
      

  12.   

    String 数据类型 (Visual Basic) 看清楚了,Visual Basic
      

  13.   

    你看看MSDN英文版的原文,看怎么翻译好...我前面说过了...VB的定位就是使初学者更容易理解所以描述相对更简单更口语化,所以对大部分人来说知道怎么用大概是什么意思就行了...如果你想深究就要去看CLR类型String和Char的解释...
    注意usually和might这两个词,后面也给出的特例...这就是我前面忽略了的“一个 Char 对象通常表示一个码位,即:Char 的数值等于该码位。但是,一个码位可能需要多个编码元素。”...其实早点应该让你注意这一句...就是说Char是UTF-16编码绝不意味着一个Char可以表示所有UTF-16字符,也就是说Char是“16位(2字节)无符号码”并不表示UTF-16是“16位(2字节)无符号码”...所以才会有“a Unicode supplementary code point (a surrogate pair) is encoded with two Char objects”和“a Char structure in a String object is not necessarily equivalent to a single Unicode character”...另外还遗漏了一句,你看看就理解了...
      

  14.   

    这是MSDN官方的翻译,相对来讲已经很准确了...MSDN的中文翻译虽然不是完美的,有不少小bug,但总体上来说还是翻译的最好的...
      

  15.   

    没错,是Visual Basic...VB2003以后的版本一律恢复为Visual Basic的名称,不再叫Visual Basic.NET...
      

  16.   

    给你看个例子using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication32
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();            Char C1 = '1'; // 一个Unicode字符
                Char C2 = '中'; // 还是一个Unicode字符            String S = C1.ToString() + C2.ToString();
                // 第一次输出 1
                // 第二次输出 2
                foreach (Char C in S)
                    MessageBox.Show(C.ToString ()); 
                
                String S1 = S.Substring(0,1); // 1
                String S2 = S.Substring(1,1); // 中
            }
        }
    }
      

  17.   

                // 第一次输出 1
                // 第二次输出 中
                foreach (Char C in S)
                    MessageBox.Show(C.ToString ()); 
                
      

  18.   

    [Quote=引用 25 楼 vrhero 的回复:
    引用 22 楼 lwl529378175 的回复:
    是你的翻译软件没有翻译好这是MSDN官方的翻译,相对来讲已经很准确了...MSDN的中文翻译虽然不是完美的,有不少小bug,但总体上来说还是翻译的最好的...
    [/Quote]
    是这样的啊。
      

  19.   

    大致明白了,感覺還是英原文比較嚴謹。有時MSDN不同地方用不同的描述,比較容易讓人糊涂謝謝各位了