日期:2014-05-19  浏览次数:20887 次

有没有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));
可以得到正确结果。

建议楼主多试几个编码的对应关系,找出其中存在的问题。