none
GB2312编码的读取值与理论值不符 RRS feed

  • 问题

  • 我在网上查到的GB2312编码表中文文字的数值范围是 从B0A0开始的. 但是我实际从C#程序中读到的却是从554A--9f44. 这到底是怎么回事呢? 我的模拟程序如下:

          string str = "啊齄②ぽφ┣";
    
          int aa = str[0]; //啊 = 十进制21834 = 十六进制 554A
          int bb = str[1]; //齄 = 十进制40772 = 十六进制 9F44
    

    网上的资料

    名称

    第一字节

    第二字节

    GB2312

    0xB0-0xF7(176-247)

    0xA0-0xFE160-254

    GBK

    0x81-0xFE129-254

    0x40-0xFE64-254

    Big5

    0x81-0xFE129-255

    0x40-0x7E64-126

    0xA10xFE161-254

     

     


    信奎爷,无所畏惧!!
    2011年5月18日 1:48

答案

  • 你这样读取当然不对的,不能直接通过取出字符串某个字符进行赋值给int,应该这样做(我只通过“啊”一个例子证明)

      static void Main(string[] args)
            {
                string str = "啊";
                byte[] bytes = System.Text.Encoding.GetEncoding("gb2312").GetBytes(str);

                Console.WriteLine(Convert.ToString(bytes[0], 16) + "" + Convert.ToString(bytes[1], 16));

            }

    输出b0a1 (十六进制)

    b0——第一字节,a1——第二字节

    显然是符合的。


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处

    2011年5月18日 5:29
    版主

全部回复

  • 你这样读取当然不对的,不能直接通过取出字符串某个字符进行赋值给int,应该这样做(我只通过“啊”一个例子证明)

      static void Main(string[] args)
            {
                string str = "啊";
                byte[] bytes = System.Text.Encoding.GetEncoding("gb2312").GetBytes(str);

                Console.WriteLine(Convert.ToString(bytes[0], 16) + "" + Convert.ToString(bytes[1], 16));

            }

    输出b0a1 (十六进制)

    b0——第一字节,a1——第二字节

    显然是符合的。


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处

    2011年5月18日 5:29
    版主
  • dear

    這篇不是已經告訴你如何取編碼的資料了嗎

    http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/75ac9f65-2dc9-487b-8cc3-65947cd47e0d/?prof=required

     


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年5月18日 5:40
  • 你这样读取当然不对的,不能直接通过取出字符串某个字符进行赋值给int,应该这样做(我只通过“啊”一个例子证明)

      static void Main(string[] args)
            {
                string str = "啊";
                byte[] bytes = System.Text.Encoding.GetEncoding("gb2312").GetBytes(str);

                Console.WriteLine(Convert.ToString(bytes[0], 16) + "" + Convert.ToString(bytes[1], 16));

            }

    输出b0a1 (十六进制)

    b0——第一字节,a1——第二字节

    显然是符合的。


     

    哇, 原来是因为string[i]的返回值不能直接赋值给int的缘故...以后我也要注意了. 不过我就是比较纳闷string[i]的返回值到底是个什么东西.... C++是可以这样赋值的.. 


    信奎爷,无所畏惧!!
    2011年5月19日 1:30