字符串编码转换问题?encoding.utf8 ,default

huanglong302 2014-06-11 09:20:36
如题,做了个测试程序,检测编码转换的问题,理论上利用Encoding.Convert进行两次编码转换后应该得到原字符串,但测试结果不是这样,测试程序如下!
using System;
using System.Collections.Generic;
using System.Text;

namespace EncodeChange
{
class Program
{
static void Main(string[] args)
{
while(true)
{
Console.WriteLine("/****请输入原始数据!****/");
string data=Console.ReadLine();
Console.WriteLine("/****转换后数据:****/");
Console.WriteLine(ChangeStr(data));
Console.WriteLine("\n");
}
}

private static string ChangeStr(string str)
{
return Utf8ToDefault(DefaultToUtf8(str));
}
private static string DefaultToUtf8(string str)
{
byte[] temp = Encoding.UTF8.GetBytes(str);
byte[] temp1 = Encoding.Convert(Encoding.Default, Encoding.UTF8, temp);
string result = Encoding.UTF8.GetString(temp1);
return result;
}

private static string Utf8ToDefault(string str)
{
byte[] temp = Encoding.Default.GetBytes(str);
byte[] temp1 = Encoding.Convert(Encoding.UTF8, Encoding.Default, temp);
string result = Encoding.Default.GetString(temp1);
return result;
}
}
}


//测试结果:


问题:
为什么3个汉字字符会有乱码出现,两个就不会?望指点!
...全文
2523 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2014-06-11
  • 打赏
  • 举报
回复
.NET Framework 中的字符编码 UTF-8用3个字节编码一个汉字,Default(在中文系统上是GB18030)用2或4字节编码一个汉字(大部分是2字节)。3个汉字由UTF-8编码后变为9字节,而Default解码时每2字节解码为一个汉字,最后一个字节无法解码,则回退为'?'。 反过来也是一样的状况,由于字节数不足,发生编码回退,最后导致编码错误。 因此你认为可逆的方法其实是不可逆的。
rtdb 2014-06-11
  • 打赏
  • 举报
回复
乱码基本上是不可逆的。你还是去查为什么乱码吧
louie333 2014-06-11
  • 打赏
  • 举报
回复
JAVA里经常遇到类型转换问题,还是一下子搞清楚比较好!
huanglong302 2014-06-11
  • 打赏
  • 举报
回复
引用 6 楼 rtdb 的回复:
[quote=引用 5 楼 huanglong302 的回复:] 对的,但同一台机子上的这种测试,为什么结果不一样?
因为你写反了,这样就对了:

            private static string DefaultToUtf8(string str)
            {
                byte[] temp = Encoding.Default.GetBytes(str);
                byte[] temp1 = Encoding.Convert(Encoding.Default, Encoding.UTF8, temp);
                string result = Encoding.UTF8.GetString(temp1);
                return result;
            }

            private static string Utf8ToDefault(string str)
            {
                byte[] temp = Encoding.UTF8.GetBytes(str);
                byte[] temp1 = Encoding.Convert(Encoding.UTF8, Encoding.Default, temp);
                string result = Encoding.Default.GetString(temp1);
                return result;
            }
[/quote] 对的,其实,这个需求是来自项目中遇到的问题,服务器传回的是utf8的字符串,是乱码,我需要将这个字符串转换为c#能识别的正常码。 其实我的项目只需要调用 Utf8ToDefault(string strWrong),strWrong是乱码,为了模拟这个乱码的产生,我引入了DefaultToUtf8(string strNormal) strNormal是正常的。 我纠结的是这两个方法看来是可逆的,为什么逆出来的结果不一样呢? 楼上所说的可能每个方法单独来讲都是可逆的,传入正常码都能回到正常码,我提出来的两个方法整体来看也应该是可逆的,即从第一个方法传入正常码,第二个方法应该也传回正常码,不应该有乱码才对。
rtdb 2014-06-11
  • 打赏
  • 举报
回复
引用 5 楼 huanglong302 的回复:
对的,但同一台机子上的这种测试,为什么结果不一样?
因为你写反了,这样就对了:

            private static string DefaultToUtf8(string str)
            {
                byte[] temp = Encoding.Default.GetBytes(str);
                byte[] temp1 = Encoding.Convert(Encoding.Default, Encoding.UTF8, temp);
                string result = Encoding.UTF8.GetString(temp1);
                return result;
            }

            private static string Utf8ToDefault(string str)
            {
                byte[] temp = Encoding.UTF8.GetBytes(str);
                byte[] temp1 = Encoding.Convert(Encoding.UTF8, Encoding.Default, temp);
                string result = Encoding.Default.GetString(temp1);
                return result;
            }
huanglong302 2014-06-11
  • 打赏
  • 举报
回复
对的,但同一台机子上的这种测试,为什么结果不一样?
rtdb 2014-06-11
  • 打赏
  • 举报
回复
尽量不要用Default,不同机器是不一样的,可能是“GB2312”,也可能是其它的。 统一使用UTF8最好。
  • 打赏
  • 举报
回复
byte[] temp1 = Encoding.Convert(Encoding.UTF8, Encoding.Default, temp); 中的Encoding.Default 改成gb2312
huanglong302 2014-06-11
  • 打赏
  • 举报
回复
谢谢1楼的,你的意思是所有的Encoding.default 换为 Encoding.GetEncoding("GB2312")吗?经测试是一样的效果
编程有钱人了 2014-06-11
  • 打赏
  • 举报
回复
Utf8ToDefault(string str) 把“Default” 换成“GB2312”
tcmakebest 2014-06-11
  • 打赏
  • 举报
回复
字符串与 byte[] 转换的时候,必须使用同一个 Encoding,所以 DefaultToUtf8 中,第二句和第三句的 Encoding 都反了。
於黾 2014-06-11
  • 打赏
  • 举报
回复
如果你能获取到原始编码的byte数组,确实可以用UTF8解码出正确的字符. 但是如果你得到的已经是一组乱码,则不可能反解出正确的字符. 因为所有无法编译的数据都已经显示为问号和方块,你无法知道它原来到底是个什么东西.
tanta 2014-06-11
  • 打赏
  • 举报
回复
正确的是这样的

 static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("/****请输入原始数据!****/");
                string data = Console.ReadLine();
                Console.WriteLine("/****转换后数据:****/");
                Console.WriteLine(ChangeStr(data));
                Console.WriteLine("\n");
            }
        }

        private static string ChangeStr(string str)
        {
            return Utf8ToDefault(DefaultToUtf8(str));
        }
        private static string DefaultToUtf8(string str)
        {
            //byte[] temp = Encoding.UTF8.GetBytes(str);
            byte[] temp = Encoding.Default.GetBytes(str);
            //byte[] temp1 = Encoding.Convert(Encoding.UTF8, Encoding.Default, temp);
            byte[] temp1 = Encoding.Convert(Encoding.Default, Encoding.UTF8, temp);
            string result = Encoding.UTF8.GetString(temp1);
            return result;
        }

        private static string Utf8ToDefault(string str)
        {
            byte[] temp = Encoding.UTF8.GetBytes(str);
            //byte[] temp = Encoding.Default.GetBytes(str);
            //byte[] temp1 = Encoding.Convert(Encoding.Default, Encoding.UTF8, temp);
            byte[] temp1 = Encoding.Convert(Encoding.UTF8, Encoding.Default, temp);
            string result = Encoding.Default.GetString(temp1);
            return result;
        }
你的写的有错误。

111,101

社区成员

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

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

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