C# GB2312 转 UTF-8

wtoeb 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。源网页和目标网页的编码方式都不可能因为我这个问题而改变。
...全文
13634 87 打赏 收藏 转发到动态 举报
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
glrwy 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

.NET中内存中的字符串都是Unicode,其它编码只能存在于byte数组、流、文件中
你把存放UTF8编码的字节数组,当作GB2312来转为字符串,当然结果不可能正确
要明白原理,不要想当然~
[/Quote]

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

string content = System.IO.File.ReadAllText("test.txt");


那么 content 内部是什么状态呢
岂_辰 2012-07-29
  • 打赏
  • 举报
回复
学习了!
sunylf 2012-07-26
  • 打赏
  • 举报
回复
string str= System.Web.HttpUtility.UrlEncode("韦儿天空", Encoding.UTF8);

一行搞定.
liuzhaoyangg 2012-05-28
  • 打赏
  • 举报
回复
var result = _reader.decode(binBitmap); 这段代码, 相信看过wp7利用zxing接口的朋友都很熟悉,但是他有个问题就是无法识别中文 ,
我看java里实现是这样的


Hashtable<Object, Object> hints = new Hashtable<Object, Object>();
hints.put(DecodeHintType.CHARACTER_SET, "GBK");

result = new MultiFormatReader().decode(bitmap, hints);


但是c#的zxing接口里的DecodeHintType却没有.CHARACTER_SET属性 不知道有没有实现 wp7 二维码扫描能扫描中文的? 求教 很急 谢谢!

利用Zxing提供的C#接口创建wp7二维码地址:
http://www.hugwp.com/forum.php?mod=viewthread&tid=1318&reltid=1442&pre_pos=6&ext=
鸭脖 2012-04-22
  • 打赏
  • 举报
回复
.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-04-22
  • 打赏
  • 举报
回复
靠,我,觉得楼主的代码就有一点写错了,本来是个很简单的问题但是大家下面各种误解,,,。。
dotnet90 2012-02-27
  • 打赏
  • 举报
回复
我转换成功了
2012-02-27
  • 打赏
  • 举报
回复
LS你怎么转的?
chentl_1987 2011-08-25
  • 打赏
  • 举报
回复
我也纠结这个问题 到底用什么呀
我是URl 传值 到本页面 前台<%= %>绑定
同样出现乱码
再见品月 2010-10-28
  • 打赏
  • 举报
回复
mark
hello520 2010-10-09
  • 打赏
  • 举报
回复
byte[] buf = Encoding.GetEncoding(936).GetBytes(str);
Encoding e1 = Encoding.UTF8;
Encoding e2 = Encoding.GetEncoding(936);
string word = System.Web.HttpUtility.UrlEncode(Encoding.Convert(e2, e1, buf)); //gb2312->utf8

不知道几楼的这个代码 最近经常忘事 刚想的事马上就忘了 在本身就知道流里面的数据是可以编成某种码的时候自然没问题问题的
比如开始这个流可以转成代码页为936对应的编码 再 转 utf-8 自然是没有问题的
如果开始是只能转成utf8的 用了936对应的编码去转 自然一堆乱码 后面再去convert这一堆乱码会是啥情况
自然还是一堆乱码 可能是很多问号或者很多框框 其实是字体里面对应的位置都是同一个东东
字体可是一个相当大的东东 改字体去重新对应一下 改字体其实也简单 可以乱改的 就是太费事 估计要花个天文时间 而且别人机器上没有你改过的字体也是显示不正常的 用来加密也不错 哈哈
还是说改编码 呵呵 反正乱了 这个时候用indexof 一下某一个字符 如果有 就对应某种编码 如果没有说明用错了编码 怎么都查不出来的 换一种().getbyte 和 convert那相应的也改改 继续indexof 直到indexof()>-1 这个括号里面这个字符你自己去考虑用啥了 这样就用正确的编码顺序正确显示了 其实一般也就是那么2种编码互转而已。 貌似写完了 忘了
reblkrelk 2010-08-04
  • 打赏
  • 举报
回复
其实LZ的问题很简单,就是得到了已经是乱码的字符串,怎么样才能让它正常显示出来!
如,后台数据库为BIG5编码,如果用DataSet得到的数据集里的字符字段一定会显示乱码.怎么才能让它正常显示出来呢!因为前面大家都说String str="字符串",但实际是得到的str="^%$#*&%"或其它的乱码了,请问怎么才能把乱码正常显示出来呢??
jobs24 2010-06-01
  • 打赏
  • 举报
回复
再证明下:MichaelWhere的方法最简单明了。
jobs24 2010-06-01
  • 打赏
  • 举报
回复
达梦科技特此证明:就只有don_gao说的是正确的,其他的都是扯旦。
soho00147 2010-01-17
  • 打赏
  • 举报
回复
//Pass the filepath and filename to the StreamWriter Constructor
StreamWriter sw = new StreamWriter(filepath, false, encode);

//Encoding encoding = new
//char[] encodedBytes = BitConverter.ToChar(
//BitConverter
byte[] encodedBytes = encode.GetBytes(content);
char[] charData = encode.GetChars(encodedBytes);
//BitConverter.
//string encodedcontent = encode.GetString(Encoding.Default.GetBytes(content));//encodedBytes.ToString();
sw.Write(charData);


//Write a line of text
//sw.WriteLine("Hello World!!");

//Write a second line of text
//sw.WriteLine("From the StreamWriter class");

//Close the file
sw.Close();
小范f-li.cn 2009-12-31
  • 打赏
  • 举报
回复
- -
boboware 2008-06-26
  • 打赏
  • 举报
回复
楼上的正解
MichaelWhere 2008-04-01
  • 打赏
  • 举报
回复

string str = "韦儿天空";
str= HttpUtility.UrlEncode(str, Encoding.UTF8);


帖错了,再来一遍
MichaelWhere 2008-04-01
  • 打赏
  • 举报
回复
string str = "韦儿天空";
str= HttpUtility.UrlEncode(strBefore, Encoding.UTF8);

这样就可以解决了,哎,可惜没分了
b哈利路亚d 2008-03-12
  • 打赏
  • 举报
回复
我想问问你要转化的所谓的 “GB2312"串是怎么获得的?
是从文本读入,还是流传过来?不会原来就是字符串吧!
如果原来是字符串,你转换有什么用?
字符串的话是不分编码的,只有流存在编码一说。
这样的话,你就需要确定好流是什么编码。
然后获得string对象,注意,这里的string只是单纯的string,
不存在转码,只是把流的内容读入string。
然后如果你需要转成utf-8的话,相信前面的方法你看得懂吧。
这里也不需要转码,只是指定一下string输出流的编码罢了。
所以,怎么会出现 "转换错误" ??
还有如果你保存为文件的话,注意文件保存的编码。
如果页面显示的话,注意页面的编码。
ok?
加载更多回复(66)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧