有没有unicode和utf8相互转换的代码?
研究一下,想实现,编码和字符的转换并显示。
昨天在另一贴里解决了大部分问题,但还有部分字符没能显示正常,在EXCEL中显示正常。
以下代码由Jinglecat提供
int n = int.Parse( "30E0 ", System.Globalization.NumberStyles.AllowHexSpecifier);
byte[] bytes = BitConverter.GetBytes(n);
string str = System.Text.Encoding.Unicode.GetString(bytes); // 输出 ム
------解决方案--------------------沙发帮忙顶
------解决方案--------------------int n = int.Parse( "30E0 ", System.Globalization.NumberStyles.AllowHexSpecifier);
你怎么得到这个30E0的?
------解决方案--------------------Encoding.Convert
------解决方案--------------------编码之间的转换(字节数组),编码与字符串的转换,Encoding类都有现成的方法
------解决方案--------------------Encoding.Convert(Encoding.Unicode,Encoding.UTF8,bytes)
------解决方案--------------------Encoding.Unicode.GetBytes(StringYours);
Encoding.Convert(Encoding.Unicode,Encoding.UTF8,bytes)
如果这两句你真的明白了 我想你的问题就解决了
这两句可以进行几乎所有需要的字符编码转换
------解决方案--------------------我做了个测试
string test = "中 ";
byte[] unicb;
byte[] utf8b;
unicb = Encoding.Unicode.GetBytes(test);
Console.WriteLine( "UNICODE Encoding: {0} bytes ", unicb.Length);
DisplayArray(unicb);
utf8b = Encoding.UTF8.GetBytes(test);
Console.WriteLine( "UTF8 Encoding: {0} bytes ", utf8b.Length);
DisplayArray(utf8b);
其中DisplayArray函数如下:
static void DisplayArray(byte[] b)
{
Console.WriteLine(BitConverter.ToString(b,0));
for (int i = 0; i < b.Length; i++)
Console.Write(b[i].ToString( "0000 ")+ " ");
Console.WriteLine();
Console.WriteLine(BitConverter.ToString(b, 0));
Console.WriteLine();
}
得到的结果:
-------------------
UNICODE Encoding: 2 bytes
2D-4E
0045 0078
2D-4E
UTF8 Encoding: 3 bytes
E4-B8-AD
0228 0184 0173
E4-B8-AD
-----------------
以UTF8为例:
byte[] stringbyte = BitConverter.GetBytes(Convert.ToInt32( "E4B8AD ", 16));
这里得到的stringbyte长度为4
0173 0184 0228 0000
且数据倒置了,也就是说用这个stringbyte得不到“中”字
Console.WriteLine(Encoding.UTF8.GetString(stringbyte));
笨办法:
byte[] stringbyte = BitConverter.GetBytes(Convert.ToInt32( "E4B8AD ", 16));
byte[] newstringbyte = new byte[3];
newstringbyte[0] = stringbyte[2];
newstringbyte[1] = stringbyte[1];
newstringbyte[2] = stringbyte[0];
Console.WriteLine(Encoding.UTF8.GetString(newstringbyte));
可以得到正确结果。
建议楼主多试几个编码的对应关系,找出其中存在的问题。