在利用Reflector进行程序集反编译查看时,经常可以看到用Unicode编码的原中文字符串,如:this.str = "/u6570/u636e/u5e93/u64cd/u4f5c/u95ee/u9898/uff0c/u8bf7/u60a8/u91cd/u65b0/u767b/u5f55/uff01";,其实源代码中是:this.mvarError = "数据库操作问题,请您重新登录!";如是想做一个简单的Unicode编码到Gb2312编码进行转换的小工具,应该很简单,不是吗?
新建一窗体,放一两个TextBox控件,一个用来接受待解码的Unicode编码,另一个将转换的中文结果进行输出,再加一个Button按键,来进行转换操作。
然而,不管理我怎么转换,输入是什么,输出的仍然是什么。但如果不是从TextBox控件的Text属性中取得输入的Unicode编码值,而是直接在源代码编辑器中写string str = "/u6570/u636e/u5e93/u64cd/u4f5c/u95ee/u9898/uff0c/u8bf7/u60a8/u91cd/u65b0/u767b/u5f55/uff01";赋值语句,DotNet会自动识别其为Unicode编码,直接返回str,即可得到中文(如果当前线程相关的语言文化为“zh-CN”),但如果是从TextBox中取的值,DotNet会为其加上“@”符号,识别为字符串。
怎么把从TextBox.Text中取得的str=@"/u6570/u636e/u5e93/u64cd/u4f5c/u95ee/u9898/uff0c/u8bf7/u60a8/u91cd/u65b0/u767b/u5f55/uff01" 在源代码中变为str="/u6570/u636e/u5e93/u64cd/u4f5c/u95ee/u9898/uff0c/u8bf7/u60a8/u91cd/u65b0/u767b/u5f55/uff01",从而返回中文呢?
DotNet中好像没有提供很好的方法,一个小小的Unicode编码到GB2312编码的工具也做不下去了
后记:其实是自已对Unicode的编码不太了解,Unicode编码中"/u"后面的4位16进制数字为即为Unicode码值,只有分解对应的数据,转换为16进制后,再转为Char字符,即可实现Unicode编码到中文的转换。
public string ConvertToGb2312(string str)
{
string[] strArray = str.Replace("//","").Split('u');
byte[] bytesArray = new byte[strArray.Length];
char[] charArray = new char[strArray.Length];
string ret=string.Empty;
for(int i=0;i<strArray.Length;i++)
{
if(strArray[i].Length==0) continue;
charArray[i] = System.Convert.ToChar(System.Convert.ToInt32(strArray[i],16));
//charArray
ret += charArray[i].ToString();
}
return ret;
}