“的”字的 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# 是怎么弄这些编码的吗?
如何将改编码的文本转换为 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# 是怎么弄这些编码的吗?
//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;
原因是这样的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 中的字典了
但为了使用 C# 的丰富 UI 资源,所以才选择了 C#
C# 过于智能化了,有些细节不知其内部如何处理的当然,还可以间接地去调用 IronPython 脚本进行处理,处理完毕后再将结果返回
但,要处理的字典过于庞大,跨语言交互,性能损失严重
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();
}
而 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}