字符编码格式转换

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)
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);
解码:
// "ztKwrsTj"是“我爱你”的base64编码
byte [] outputb  =  Convert.FromBase64String( " ztKwrsTj " );
string  orgStr =  Encoding.Default.GetString(outputb);

将string看做一个指针,然后对这个指针处的内容进行处理,然后就得到了编码后的字符。


看下面的讨论:http://bbs.csdn.net/topics/190168041

发表于: 2007-12-21 12:35:19
如何把GB2312转为UTF-8的问题,如果全部是中文,可以实现正常转换,但是如果其中有数字或字母,那就会存在乱码。

我的代码如下:
System.Text.Encoding GB2312 = System.Text.Encoding.GetEncoding("GB2312");
System.Text.Encoding UTF8   = System.Text.Encoding.UTF8;
msg = GB2312.GetString(System.Text.Encoding.Convert(GB2312,UTF8,GB2312.GetBytes(str)));

出错信息如下:
源GB2312串:          2005年03期
转换成UTF8得到的串:  2005�?3�?
源串:                 张虎勤 ZHANG Hu-qin
转换后成为乱码串:     张虎�?ZHANG Hu-qin

运行环境是这样的,源网页是GB2312,目标页面是UTF-8。源网页和目标网页的编码方式都不可能因为我这个问题而改变。
回复于: 2008-01-23 22:09:48
你拿到了string就是string,它是没有编码的
--------------
谁说string没有编码...VMM已经讲的很清楚了...怎么这么长时间还有这么多人不清楚...


字符串是Unicode字符的有序集合

字符串中的每个Unicode字符都是由Unicode标量值定义的,Unicode标量值也称为Unicode码位或者Unicode字符的序号(数字)值。每个码位都是使用UTF-16编码进行编码的,编码的每个元素的数值都用一个Char对象表示。

string和char都是UTF-16编码...

也就是说... 只有非string和char形式存在的字符数据才有其它编码...即VMM一开始说的byte数组、流、文件等...

回复于: 2008-02-18 16:26:49
都怪你们大学基础课不好好上. 讨论串不串什么的.都没好好上组成原理课吧.

问:计算机是怎么表示文字的?  他不会. 他就会说0和1.
于是乎 有一帮人为了表示字母和各种符号,就发明了ASCII 实际上就是固定了.一个八位的字节固定的01排列来表示固定的字符.
比如.字母A 的ASCII码就是.65. 这个排列就是.01000001.当然,这只是ASCII的编码,同样呢,有好多好多种编码,当然道理是一样的. 当你要把这个串"A",发送到别的机器,千万要记住,你发的不是文本"A",你发过去的是一串01000001(ASCII的时候).又因为可能是现在UNICODE可心兼容多国语言,所心.NET里,你写的每一个字符串,都是UNICODE的了.所以,你想要控制发送的数据的编码,不应该在字符串上做脚,你只能在发送的流(也就是byte)上做手脚. 这样说能明白点不?

.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
引用 1 楼  的回复:
.NET中内存中的字符串都是Unicode,其它编码只能存在于byte数组、流、文件中
你把存放UTF8编码的字节数组,当作GB2312来转为字符串,当然结果不可能正确
要明白原理,不要想当然~


请教一个问题,如果有一个磁盘文件内容是“中文”,编码方式是 gb2312,使用

C# code
?
1
string  content = System.IO.File.ReadAllText( "test.txt" );


那么 content 内部是什么状态呢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值