C#之类的面向对象语言中,如何进行编码格式的转换?
在C语言中,我们使用printf函数可以轻易的将一种格式打印为另外一种格式,如%d,%f,这样就会看到不同的结果。
C#中如何将一种格式编码成另外一种格式? 如"12345"转为hex格式的"0102030405"?
我想只要两步就可以了:
1)byte [] bytes = Encoding.Default.GetBytes( " 要转换的字符串 " );
2) 将bytes数组转为想要的格式
如下所示:参考(http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx)
编码:
将string看做一个指针,然后对这个指针处的内容进行处理,然后就得到了编码后的字符。
.Net下的默认编码确实是unicode,即我们所说的utf-8,注意这里不是ucs-2.楼主的意思无非就是如果你通过网络接收到一个gb2312编码的字符的字节流的话,怎么在C#中使其显示不乱码。楼主代码就有一点是不对的,System.Text.Encoding GB2312 = System.Text.Encoding.GetEncoding("GB2312");
System.Text.Encoding UTF8 = System.Text.Encoding.UTF8;
msg = UTF8.GetString(System.Text.Encoding.Convert(GB2312,UTF8,GB2312.GetBytes(str)));
由于你通过convert方法得到的是该字符串的utf8字节数组,所以你在getstring的时候也应该用utf8的encoding对象,搞错啦!试了一下改过来之后是不会乱码的。这就是你在解析这些二进制串的时候用错了方法,当然不可能得到正确的字符串结果。字符编码其实很简单,就是一个string对象通过不同的字符编码表能映射为不同的二进制串,你可以将同一个字符串通过不同的字符编码表映射为不同的二进制串,也可以在这些不同的二进制串之间进行相互的转换,但是你在解析这些二进制串的时候一定要按特定的编码方式进行,如果encode和decode不是配对的,那么便会乱码。但是其实楼主可以直接通过构造gb2312的encoding对象,通过该对象的getstring方法直接解析接受到的gb2312字符的字节流。
在C语言中,我们使用printf函数可以轻易的将一种格式打印为另外一种格式,如%d,%f,这样就会看到不同的结果。
C#中如何将一种格式编码成另外一种格式? 如"12345"转为hex格式的"0102030405"?
我想只要两步就可以了:
1)byte [] bytes = Encoding.Default.GetBytes( " 要转换的字符串 " );
2) 将bytes数组转为想要的格式
如下所示:参考(http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx)
using System;
using System.Text;
class Example
{
static void Main()
{
string unicodeString = "This string contains the unicode character Pi (\u03a0)";
// Create two different encodings.
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
// Convert the string into a byte array.
byte[] unicodeBytes = unicode.GetBytes(unicodeString);
// Perform the conversion from one encoding to the other.
byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
// Convert the new byte[] into a char[] and then into a string.
char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
string asciiString = new string(asciiChars);
// Display the strings created before and after the conversion.
Console.WriteLine("Original string: {0}", unicodeString);
Console.WriteLine("Ascii converted string: {0}", asciiString);
}
}
// The example displays the following output:
// Original string: This string contains the unicode character Pi (Π)
// Ascii converted string: This string contains the unicode character Pi (?)
另外一个例子:
编码:
byte
[] bytes
=
Encoding.Default.GetBytes(
"
要转换的字符串
"
);
string s=Convert.ToBase64String(bytes);
解码:
string s=Convert.ToBase64String(bytes);
//
"ztKwrsTj"是“我爱你”的base64编码
byte [] outputb = Convert.FromBase64String( " ztKwrsTj " );
string orgStr = Encoding.Default.GetString(outputb);
byte [] outputb = Convert.FromBase64String( " ztKwrsTj " );
string orgStr = Encoding.Default.GetString(outputb);
看下面的讨论:http://bbs.csdn.net/topics/190168041
发表于: 2007-12-21 12:35:19
回复于: 2008-01-23 22:09:48
回复于: 2008-02-18 16:26:49
.Net下的默认编码确实是unicode,即我们所说的utf-8,注意这里不是ucs-2.楼主的意思无非就是如果你通过网络接收到一个gb2312编码的字符的字节流的话,怎么在C#中使其显示不乱码。楼主代码就有一点是不对的,System.Text.Encoding GB2312 = System.Text.Encoding.GetEncoding("GB2312");
System.Text.Encoding UTF8 = System.Text.Encoding.UTF8;
msg = UTF8.GetString(System.Text.Encoding.Convert(GB2312,UTF8,GB2312.GetBytes(str)));
由于你通过convert方法得到的是该字符串的utf8字节数组,所以你在getstring的时候也应该用utf8的encoding对象,搞错啦!试了一下改过来之后是不会乱码的。这就是你在解析这些二进制串的时候用错了方法,当然不可能得到正确的字符串结果。字符编码其实很简单,就是一个string对象通过不同的字符编码表能映射为不同的二进制串,你可以将同一个字符串通过不同的字符编码表映射为不同的二进制串,也可以在这些不同的二进制串之间进行相互的转换,但是你在解析这些二进制串的时候一定要按特定的编码方式进行,如果encode和decode不是配对的,那么便会乱码。但是其实楼主可以直接通过构造gb2312的encoding对象,通过该对象的getstring方法直接解析接受到的gb2312字符的字节流。
回复于: 2012-08-29 11:05:42