当前位置:编程学习 > C#/ASP.NET >>

请教文本编码问题

“的”字的 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# 是怎么弄这些编码的吗? --------------------编程问答-------------------- sUtf8 = "\xe7\x9a\x84"; 是从 Python 中读过来的,所以无法改变源。

不要让我去拆源。

--------------------编程问答-------------------- 开始赋值时错了。

下面代码工作正常


           //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;


--------------------编程问答--------------------
引用 2 楼 findcaiyzh 的回复:
开始赋值时错了。

下面代码工作正常

C# code

           //string sUtf8 = "\xe7\x9a\x84";
            byte[] bUtf8 = { 0xe7, 0x9a, 0x84 };
            byte[] bChs = Encoding.Convert(Encoding.UTF8, Encoding.GetEn……


不是吧 这么快。
lz这是对的。 --------------------编程问答-------------------- 谢谢楼上的,我也明白你的意思。

但我实际上得到的是一开始赋值时的串。
原因是这样的

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 中的字典了
--------------------编程问答-------------------- 这个用 python 和 C++ 处理都相当简单,原本打算用 MFC 做的
但为了使用 C# 的丰富 UI 资源,所以才选择了 C#
C# 过于智能化了,有些细节不知其内部如何处理的

当然,还可以间接地去调用 IronPython 脚本进行处理,处理完毕后再将结果返回
但,要处理的字典过于庞大,跨语言交互,性能损失严重 --------------------编程问答-------------------- 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();
        } --------------------编程问答-------------------- 嗯,说到点上了

产生这个问题的原因是,“的”字在 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# 无法识别(只能以原本的方式表达为字符串)。

--------------------编程问答-------------------- 所以问题就变为 硬破:
将 "\xe7\x9a\x84" 转换为 byte[]{0xe7, 0x9a, 0x84}
--------------------编程问答-------------------- 但 IronPython 作为 .net 下的 Python,按道理这种简单的问题,是有解决之道的--也许我并未了解
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,