有一个UTF8码的字符串,如何转换为正文。例如: “鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠” 对应的正文是:“博客园用户帐户激活邮件”C#如何实现转换 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 s = "鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠"; byte[] bs = Encoding.Default.GetBytes(s); bs = Encoding.Convert(Encoding.UTF8, Encoding.Default, bs); s = Encoding.Default.GetString(bs); 还有“鍗氬鍥數瀛愭湡鍒奛o38.2010骞?1鏈堝垔”用您的代码转换后为“博客园电子期刊No38.2010??1月刊”而正确的正文是“博客园电子期刊No38.2010年11月刊” 这非常容易成为“瞎说”。因为.net的内部的字符串就是unicode编码的,你把一个gb2312的字节流按照unicode读入成为一个unicode编码的“乱码”,然后再以gb2312读取其byte[]再显示,怎么能不丢失时数据呢?当你第一个环节——把gb2312编码的byte[]按照unicode读取成字符串时就已经丢失字节了。所以请你贴出你当初如何得到那个所谓“乱码字符串”的代码,要修改也必须提前到那里去修改。再说一下,不要胡乱使用Ecoding.Default!这个代码在不同的系统的机器上结果是不同的,所以不要乱用。如果是gb2312就用Encoding.GetEncoding("gb2312"),如果是utf8就用Encoding.UTF8,不明白的时候千万不要胡乱使用Encoding.Default。 当然可能是你用unicode方式去读取了gb2312编码的字符串,也可能是胡乱使用Encoding.Default去读取了(你明明知道是utf8的)字符串。这两种之中你很可能有一种毛病。看了上面几个回复,我想你可能是犯了第二种毛病的几率更大,因为那么多人都在毫无确定理由的情况下就随便使用Encoding.Default。我其实对使用Encoding.Default非常“敏感”,因为我遇到的都是“胡写”Encoding.Default,大多都是因为不知道该用什么编码于是自欺欺人地使用Encoding.Default以为它自动给你选择了什么编码——其实它给你选择了什么编码你想过吗?所以动动脑筋,不要随便使用Encoding.Default。 //楼主应该是这么得到你的字符串的吧byte[] bs = Encoding.Default.GetBytes("博客园用户帐户激活邮件");bs = Encoding.Convert(Encoding.Default, Encoding.UTF8, bs);string output= Encoding.Default.GetString(bs);//output="鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?"比你提供的字符串最后多了个?,就像楼上说的转换过程中数据已经丢失了,编码不认识才出现问号,已经缺失的数据,再转回去肯定不行了最后一句错了,改成string output= Encoding.UTF8.GetString(bs);可以正常转换Encoding.Default最好不要用,每台电脑上的默认字符集可能不一样。 那请先生看看:string s = "博客园用户帐户激活邮件";string r = Convert.ToBase64String(Encoding.UTF8.GetBytes(s));string ss= Encoding.GetEncoding("gb2312").GetString(Convert.FromBase64String(r)) ;上面这三句代码运行后得到:ss = "鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?"那么,由“鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?” 如何变回 “博客园用户帐户激活邮件” 应该有来就有去吗。用.net代码生成的“鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?”,恐怕不需要自己关心其中的编码问题吧,既然.net代码能生成“鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?”,.net代码应该还能回到“博客园用户帐户激活邮件”。关于为什么不能的问题,则需要非常精通编码的高人给出令人信服的解释,并且通俗易懂。 编码,就意味着规则,不符合规则的就可能被代替甚至被抛弃。既然被抛弃了,怎么说得上“有来就有去”呢?string s = "博客园ABC";byte[] bs = Encoding.ASCII.GetBytes(s); // ???ABCstring ss = Encoding.ASCII.GetString(bs); // ???ABC dataGridView1的超链接显示图片 新人,求正则表达式 C# SQL事务处理时整个表被占用,求解决方法! 求一抽奖程序!!密码问题! 方法声明中参数methodName(int? parameterName) 其中那个"?"什么意思啊? 实在没法了 关于DataRow的问题 急!!!请大家帮看看 在线等 windows服务安装之后不能运行的问题,急! 间隔一定事件后,系统自动更新某些状态信息的问题。比如图书管理系统中借书30天后到期的问题。 16进制转换问题 如何播放wav文件?(不用其他软件播放) winform读取电子磅秤数据 这里的“?”什么意思
s = "鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠";
byte[] bs = Encoding.Default.GetBytes(s);
bs = Encoding.Convert(Encoding.UTF8, Encoding.Default, bs);
s = Encoding.Default.GetString(bs);
还有
“鍗氬鍥數瀛愭湡鍒奛o38.2010骞?1鏈堝垔”用您的代码转换后为
“博客园电子期刊No38.2010??1月刊”而正确的正文是
“博客园电子期刊No38.2010年11月刊”
这非常容易成为“瞎说”。因为.net的内部的字符串就是unicode编码的,你把一个gb2312的字节流按照unicode读入成为一个unicode编码的“乱码”,然后再以gb2312读取其byte[]再显示,怎么能不丢失时数据呢?当你第一个环节——把gb2312编码的byte[]按照unicode读取成字符串时就已经丢失字节了。所以请你贴出你当初如何得到那个所谓“乱码字符串”的代码,要修改也必须提前到那里去修改。再说一下,不要胡乱使用Ecoding.Default!这个代码在不同的系统的机器上结果是不同的,所以不要乱用。如果是gb2312就用Encoding.GetEncoding("gb2312"),如果是utf8就用Encoding.UTF8,不明白的时候千万不要胡乱使用Encoding.Default。
byte[] bs = Encoding.Default.GetBytes("博客园用户帐户激活邮件");
bs = Encoding.Convert(Encoding.Default, Encoding.UTF8, bs);
string output= Encoding.Default.GetString(bs);//output="鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?"比你提供的字符串最后多了个?,就像楼上说的转换过程中数据已经丢失了,编码不认识才出现问号,已经缺失的数据,再转回去肯定不行了
最后一句错了,改成string output= Encoding.UTF8.GetString(bs);可以正常转换
Encoding.Default最好不要用,每台电脑上的默认字符集可能不一样。
那请先生看看:string s = "博客园用户帐户激活邮件";
string r = Convert.ToBase64String(Encoding.UTF8.GetBytes(s));
string ss= Encoding.GetEncoding("gb2312").GetString(Convert.FromBase64String(r)) ;
上面这三句代码运行后得到:
ss = "鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?"那么,由“鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?” 如何变回 “博客园用户帐户激活邮件”
应该有来就有去吗。
用.net代码生成的“鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?”,恐怕不需要自己关心其中的编码问题吧,既然.net代码能生成“鍗氬鍥敤鎴峰笎鎴锋縺娲婚偖浠?”,.net代码应该还能回到“博客园用户帐户激活邮件”。关于为什么不能的问题,则需要非常精通编码的高人给出令人信服的解释,并且通俗易懂。
既然被抛弃了,怎么说得上“有来就有去”呢?string s = "博客园ABC";
byte[] bs = Encoding.ASCII.GetBytes(s); // ???ABC
string ss = Encoding.ASCII.GetString(bs); // ???ABC