“的”字的 UTF-8 编码为:\xe7\x9a\x84
如何将改编码的文本转换为 GB18030,让起可以显示倒控件上?譬如:
string sUtf8 = "\xe7\x9a\x84";
byte[] bUtf8 = Encoding.UTF8.GetBytes(sUtf8);
byte[] bChs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB18030"), bUtf8);
string sChs = Encoding.GetEncoding("GB18030").GetString(bChs);
this.label.Text = sChs;
如果没理解错的话,上述代码应该是可以正确地在标签上显示“的”字的。
可实际上并非如此。哪位同学知道 C# 是怎么弄这些编码的吗?

解决方案 »

  1.   

    sUtf8 = "\xe7\x9a\x84"; 是从 Python 中读过来的,所以无法改变源。不要让我去拆源。
      

  2.   

    开始赋值时错了。下面代码工作正常
               //string sUtf8 = "\xe7\x9a\x84";
                byte[] bUtf8 = { 0xe7, 0x9a, 0x84 };
                byte[] bChs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB18030"), bUtf8);
                string sChs = Encoding.GetEncoding("GB18030").GetString(bChs);
                label1.Text = sChs;
      

  3.   

    谢谢楼上的,我也明白你的意思。但我实际上得到的是一开始赋值时的串。
    原因是这样的C# 里读取一个 Python 字典,刚好,python 字典中有个如此的字符串:data = {"name": "\xe7\x9a\x84"}用 IronPython 将字典 import 进来后,得到 IronPythonDictionary,假设该字典为 data。
    则,在 C# 中,这样可以获得上面的 name:
    string name = data["name"] as string;于是就得到了 "\xe7\x9a\x84" 这个串。而上面的代码改为:
    string name = data["name"] as byte[];
    这样是不可以的,name 将为 null所以我并不能控制读到的串放到字节数组中。
    当然,可以用流去读得整个 python 代码,但那样就需要自己去解释 Puthon 中的字典了
      

  4.   

    这个用 python 和 C++ 处理都相当简单,原本打算用 MFC 做的
    但为了使用 C# 的丰富 UI 资源,所以才选择了 C#
    C# 过于智能化了,有些细节不知其内部如何处理的当然,还可以间接地去调用 IronPython 脚本进行处理,处理完毕后再将结果返回
    但,要处理的字典过于庞大,跨语言交互,性能损失严重
      

  5.   

    string name = data["name"] as string;
    name到底是什么?是"\xe7\x9a\x84"  : 表示二进制为e79a84"\\xe7\\x9a\\x84";:表示就是字符串"\xe7\x9a\x84"我感觉应该是后者,自己解析成byte就可以了。例如
           public byte[] StringToByteArray(string hex)
            {
                return Enumerable.Range(0, hex.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                         .ToArray();
            }
      

  6.   

    嗯,说到点上了产生这个问题的原因是,“的”字在 python 中,其 UTF-8 编码表现为 "\xe7\x9a\x84"
    而 IronPython 2.6 不支持 Unicode,所以解释到 C# 后,其字符串保持原貌不变,即为 "\xe7\x9a\x84"。
    注意:并非消转义的 "\\xe7\\x9a\\x84"。如果以流的方式读取进来,自然就是消转义的 "\\xe7\\x9a\\x84"。如此看来,这是无解的,因为 "\xe7\x9a\x84" 是 Python 的东西,C# 无法识别(只能以原本的方式表达为字符串)。
      

  7.   

    所以问题就变为 硬破:
    将 "\xe7\x9a\x84" 转换为 byte[]{0xe7, 0x9a, 0x84}
      

  8.   

    但 IronPython 作为 .net 下的 Python,按道理这种简单的问题,是有解决之道的--也许我并未了解