看来对“样”不能转换啊。
换个方法吧string srtins = "大家最近怎么样?";
string strUtf= Encoding.GetEncoding("GB2312").GetString(Encoding.Unicode.GetBytes(srtins));
string strRet= Encoding.Unicode.GetString( Encoding.GetEncoding("GB2312").GetBytes(strUtf));
Response.Write(strRet + "<br>");

解决方案 »

  1.   

    Encoding.Convert
    楼主要进行编码转换应该用这个,而不是在各个编码间编来编去。string srtins = "大家最近怎么样?";
    byte[] bs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB2312"),
                                 Encoding.UTF8.GetBytes(srtins) );
    string strUtf = Encoding.GetEncoding("GB2312").GetString(bs);bs = Encoding.Convert(Encoding.GetEncoding("GB2312"), Encoding.UTF8, bs);
    string strRet= Encoding.UTF8.GetString(bs);
      

  2.   

    milkbb(李宇杰),你的意思是不是这样?
    string srtins = "大家最近怎么样?";
    byte[] bs = Encoding.Convert(Encoding.GetEncoding("GB2312"),Encoding.UTF8, 
    Encoding.UTF8.GetBytes(srtins) );
    string strUtf = Encoding.UTF8.GetString(bs);bs = Encoding.Convert(Encoding.UTF8,Encoding.GetEncoding("GB2312"), bs);
    string strRet= Encoding.UTF8.GetString(bs);
    输出的效果还是一样的"是大家最近怎么?"
    还有没有别的方法呢?这个究竟是.net的问题呢,还是windows的问题?
      

  3.   

    [STAThread]
    static void Main(string[] args)
    {
        string srtins = "大家最近怎么样?";
        byte[] bs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB2312"),
            Encoding.UTF8.GetBytes(srtins) );
        string strUtf = Encoding.GetEncoding("GB2312").GetString(bs);    bs = Encoding.Convert(Encoding.GetEncoding("GB2312"), Encoding.UTF8, bs);
        string strRet= Encoding.UTF8.GetString(bs);
        Console.WriteLine(strUtf); // 输出:大家最近怎么样?
        Console.WriteLine(strRet); // 输出:大家最近怎么样?
    }
    在我的机器上绝对没有问题的。楼主的情况是怎么样的,说出来,分析分析。
      

  4.   

    再不行的话只有用java来做了,好像java对UTF8比较容易处理一点
      

  5.   

    我发现楼主的问题了。
    第一个解码方式错了,不是UTF8,应该是GB2312。
      

  6.   

    你这样的话能得到字符串的UTF形式吗?字符串srtins原来是GB形式的,要转换成UTF8,应该用的是byte[] bs = Encoding.Convert(Encoding.GetEncoding("GB2312"),Encoding.UTF8, 
    Encoding.UTF8.GetBytes(srtins) );
    而不是象你那样的
    byte[] bs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB2312"),
            Encoding.UTF8.GetBytes(srtins) );吧.你这样的话相当于没有转换。最后string strRet= Encoding.UTF8.GetString(bs);得到的也不是UTF8格式的内码,而是字符串
      

  7.   

    楼主,我没明白你要的是什么。
    string类型在.net内部都是以unicode存储的,没有什么gb字符串和utf字符串。
    只有在需要的时候才需进行编码。
    楼主对这些好像搞得不太明白。
    楼主就说说想要做什么,我看看应该怎样解决。如果楼主只是想要一个字符串的UTF8编码,那
    byte[] bs = Encoding.UTF8.GetBytes(srtins);
    string ret = Encoding.UTF8.GetString(bs);
    bs 中就是了,ret 中就是对相应编码进行解码后的字符串。
      

  8.   

    谢谢milkbb,我以前没有接触过内码,所以概念不是很清楚,只是问题还没有解决原来有一个数据库是mysql,其中的字段是varchar类型的,客户端是通过jap输入的UTF8的格式,现在我用c#做一个windows下的应用程序,用string strUtf = DataReader.GetValue(i).toString()得到该字段的值,用string strRet= Encoding.UTF8.GetString( Encoding.GetEncoding("GB2312").GetBytes(strUtf) );转化以后就出现了上面少最后一个字或者最后一个字是乱码的情况。
      

  9.   

    byte[] bs = new byte[1024];
    int len = DataReader.GetBytes(
       i,
       0,
       bs,
       0,
       bs.Length
    );
    string s = Encoding.UTF8.GetString(bs, 0, len);试试看吧。
      

  10.   

    上面这个我昨天就已经试过了,报错,说是不支持的格式转换,从数据库中用DataReader.GetValue(i).toString()得到的值是"澶у鏈€杩戞€庝箞鏍?",用转换后后面就少了字符了
      

  11.   

    dataReader = command.ExecuteReader(CommandBehavior.SequentialAccess);
    然后才能用GetBytes();
    之后各个列必须按顺序访问。
    试试看行不行。
      

  12.   

    或者,有没有试过DataReader.GetString(i); ?
      

  13.   

    我觉得这个可能不是数据库存取的问题,而是编码转换的问题
    当然也可能和mysql有关系,别的数据库可能就没有这个问题了,我用别的数据库试试看
      

  14.   

    SQL SERVER和ACCESS都没这样的问题,MYSQL我没用过。
    我觉得你还是应该试试下面这个,问题的确不在存取。
    可没别的办法可以解决了,只好把原始字节拿出来,再进行解码。dataReader = command.ExecuteReader(CommandBehavior.SequentialAccess);
    byte[] bs = new byte[1024];
    int len = dataReader.GetBytes(
       i,
       0,
       bs,
       0,
       bs.Length
    );
    string s = Encoding.UTF8.GetString(bs, 0, len);
      

  15.   

    这个方法不能得到mysql的数据的,老是报错说不能进行格式转换
    看样子没有办法了!
      

  16.   

    引擎居然连getbyte都不能调用,真是土
      

  17.   

    我这里没有MySql不能测试,楼主自己试试,看看行不行。CultureInfo ci = new CultureInfo("en-us");
    CultureInfo oldci = Thread.CurrentThread.CurrentCulture;
    Thread.CurrentThread.CurrentCulture = ci;string strUtf = DataReader.GetString(i);
    string strRet = Encoding.UTF8.GetString(bs = Encoding.GetEncoding(1252).GetBytes(strUtf));Thread.CurrentThread.CurrentCulture = oldci;
      

  18.   

    噢,有点小问题,用这个:CultureInfo ci = new CultureInfo("en-us");
    CultureInfo oldci = Thread.CurrentThread.CurrentCulture;
    Thread.CurrentThread.CurrentCulture = ci;string strUtf = DataReader.GetString(i);
    string strRet = Encoding.UTF8.GetString(Encoding.GetEncoding(1252).GetBytes(strUtf));Thread.CurrentThread.CurrentCulture = oldci;
      

  19.   

    再次感谢milkbb(李宇杰)不遗余力的帮助,虽然问题还是没有解决 ^_^
    问题似乎不在这里,但是我也不能确定问题到底是在哪里。这才是最要命的。不知道在mysql中数据是怎么存取的。
    小弟在杭州,用vc编程4年,平日很少上msdn,因为很多问题都可以自己解决,今天一来很荣幸认识这位小兄弟,很想交你这个热心的朋友,到杭州来玩的时候别忘找我!
      

  20.   

    不用这么谢我,我也就是尽我所能,帮帮忙罢了。你这个问题挺有意思的。
    我知道问题在哪儿:
    在mysql中,数据是以UTF8编码存放的,而你读到程序里的,却不是用UTF8解码的。
    我原以为应该是用的 Thread.CurrentThread.CurrentCulture 中的信息进行解码的,在中文系统中,这里面的编码方式和 Encoding.Default 一样,是GB2312,可GB2312和UTF8之间互编是有损的,也就是你上面少了一个字的原因。
    可恶的是我们没法控制 DataReader.GetString() 所用的编码方式,上面我就试着改 Thread.CurrentThread.CurrentCulture 中的信息。“en-us“用的是ASCII编码,可以和UTF8无损互编,可惜,你已经试过了,不行。
    看来 DataReader.GetString() 用的是 Encoding.Default ,这个信息来自系统信息,程序改不了。
    再一种想法就是读原始字节,用 dataReader.GetBytes,可惜,也不行。
    程序这方面我是想不到什么招了,楼主还是看看数据库那边能有什么办法。
    我的QQ:25738191