如何把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。源网页和目标网页的编码方式都不可能因为我这个问题而改变。

解决方案 »

  1.   

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

  2.   

    System.Text.Encoding   GB2312   =   System.Text.Encoding.GetEncoding("GB2312"); 
    System.Text.Encoding   UTF8       =   System.Text.Encoding.UTF8; 
    msg   =   GB2312.GetString(UTF8.GetByte(str))); 
    msg   =   UTF9.GetString(GB2312.GetByte(str))); 
      

  3.   

    1、用viena说的unicode,一样存在乱码:
    GB2312.GetString(System.Text.Encoding.Convert(Unicode,UTF8,Unicode.GetBytes(str)));
    2、用fangwancong说的,也存在乱码:
    System.Text.Encoding GB2312 = System.Text.Encoding.GetEncoding("GB2312");
    System.Text.Encoding UTF8 = System.Text.Encoding.UTF8;
    msg = GB2312.GetString(UTF8.GetBytes(str));
      

  4.   

    看了2楼的回复,我真得感觉很无奈!
    //那要怎么做呢?
    直接操作byte数组或流,不要转为字符串!
      

  5.   

    1、用viena说的unicode,一样存在乱码: 
    GB2312.GetString(System.Text.Encoding.Convert(Unicode,UTF8,Unicode.GetBytes(str))); 
    ________________________________________请你看懂我的话再来说话!
      

  6.   

    GB2312.GetString的含义是把编码为GB2312的字节数组专为字符串
    而.NET中字符串只可能有一种编码,就是Unicode
    .NET中字符串的定义就是Unicode字符序列
      

  7.   

    viena,你就直接说怎么做还清楚些,感觉像在猜测谜一样。
      

  8.   

    说过了"直接操作byte数组或流,不要转为字符串!"
    但是你到底要实现什么你说了吗?我才猜谜呢!
      

  9.   

    string Info = string.Empty;
    System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
    System.Text.Encoding gb2312 = System.Text.Encoding.GetEncoding("gb2312");
    byte[] unicodeBytes = gb2312.GetBytes(str);
    byte[] asciiBytes = System.Text.Encoding.Convert(gb2312, utf8, unicodeBytes);
    char[] asciiChars = new char[utf8.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
    utf8.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
    Info = new string(asciiChars);也做过了,但是没有成功。
    另外,我只能动操作源串(GB2312)这边的程序,目标串(UTF-8)的那边我操作不了。
      

  10.   

    我不知道是我表达能力差还是你理解能力差
    我强调过不止一次了,.NET中的字符串只能是Unicode编码!
    任何字符串,必然是Unicode
    我也告诉你了不要转为字符串
    你还在这“源串(GB2312)”“目标串(UTF-8)”什么的
    我真是没有办法了~
      

  11.   

    System.Text.Encoding       GB2312       =       System.Text.Encoding.GetEncoding("GB2312");   
    System.Text.Encoding       UTF8               =       System.Text.Encoding.UTF8;   
    msg       =       GB2312.GetString(UTF8.GetByte(str)));   
    msg       =       UTF9.GetString(GB2312.GetByte(str)));   
      

  12.   

    另外,我只能动操作源串(GB2312)这边的程序,目标串(UTF-8)的那边我操作不了。问题是怎么操作流,然后发送到对方的服务器上也用流吗?对方接收的一定是字符串的。===============
    1、如果你定义了字符串(包含中英文字符),或是通过参数等其他方式传递
       是不需要进行GB2312的转化,下面的转换是没有意义的:   string str = "2005年03期";
       byte[] utf8 = Encoding.UTF8.GetBytes(str);
       string result = Encoding.UTF8.GetString(utf8);     
    2、如果是对整个文件进行编码转换,那是另一回事
       这里你可以通过流进行操作    StreamReader inStream = new StreamReader(path, Encoding.GetEncoding(936));//GB2312
        StreamWriter outStream = new StreamWriter(path, false, Encoding.GetEncoding(65001));//UTF8
        char[] chBuffer = new char[1000];
        int iCount;
        while ((iCount = inStream.Read(chBuffer, 0, 1000)) > 0)
        {
            outStream.Write(chBuffer, 0, iCount);
        }
        inStream.Close();
        outStream.Close();
      

  13.   

    搞半天,我也还是不明白,
    在我这边的程序中,是通过<input type=button value=>的post方式提交到对方的页面上的。
    我这边的页面是gb2312,对方的页面是utf-8的。
      

  14.   

    晕....难道lz不知道怎么用流来POST数据么....
    我给你个例子:byte[] dat = null;
                Stream s = null;            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"http://contacts.msn.com/abservice/abservice.asmx");
                HttpWebResponse rsp;            req.ContentType = "text/xml; charset=utf-8";  //这个你自己改成 text/html 什么的            string reqsoap = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"
                                + "<soap:Header>"
                                + "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"
                                + "<ApplicationId>996CDE1E-AA53-4477-B943-2BE802EA6166</ApplicationId>"
                                + "<IsMigration>false</IsMigration>"
                                + "<PartnerScenario>Timer</PartnerScenario>"
                                + "<CacheKey>{cachekey}</CacheKey>"
                                + "</ABApplicationHeader>"
                                + "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"
                                + "<ManagedGroupRequest>false</ManagedGroupRequest>"
                                + "<TicketToken>{ticket}</TicketToken>"
                                + "</ABAuthHeader></soap:Header><soap:Body>"
                                + "<ABContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\">"
                                + "<abId>00000000-0000-0000-0000-000000000000</abId>"
                                + "<contacts><Contact>"
                                + "<contactId>{guid}</contactId>"
                                + "</Contact></contacts>"
                                + "</ABContactDelete>"
                                + "</soap:Body>"
                                + "</soap:Envelope>";    //这里就是你的页面数据字符串....我这里长了点
                reqsoap = reqsoap.Replace("{cachekey}", HttpUtility.HtmlEncode(_Tickets["cache_key"]));
                reqsoap = reqsoap.Replace("{ticket}", HttpUtility.HtmlEncode(_Tickets["contact_ticket"]));
                reqsoap = reqsoap.Replace("{guid}", HttpUtility.HtmlEncode(contact.Guid));            dat = Encoding.UTF8.GetBytes(reqsoap);  //把你的字符串转成utf-8编码的数据            req.ContentLength = dat.Length;
                req.Method = "POST";
                req.ProtocolVersion = HttpVersion.Version11;            s = req.GetRequestStream();
                s.Write(dat, 0, dat.Length);  //写入流
                s.Close();            //try the request
                try
                {
                    rsp = (HttpWebResponse)req.GetResponse();  
                }
                catch (WebException webex)
                {
                    string data = "";
                    if (webex.Response != null)
                    {
                        StreamReader r = new StreamReader(webex.Response.GetResponseStream());
                        data = r.ReadToEnd();
                        r.Close();
                    }                throw new Exception("Contact Delete Request error: " + webex.Message + "\r\n" + data);
                }
      

  15.   

    难道一定要通过后台程序么,你无非是要原网页与目标网页编码一致不乱码,或者网页编码统一
    可以考虑把原网页直接用convertz802转化为UTF-8的格式,根据我的使用来看,convertz确实是一款不错的转码程序,某位香港同仁编写的。
      

  16.   

    没有从DOS时代过来的人?真的对字符编码这么难理解吗?
      

  17.   

    还有一个疑问,为什么你这边不用UTF-8,非要转来转去的?byte[] unicodeBytes = gb2312.GetBytes(str); 你这句里的str此时已经是“Unicode”字符(UTF8是Unicode的一种编码)了,也就是已经进行了默认的转换了,以后再怎么转也没用了...
      

  18.   

    试试 对 string 和 byte[] base64后在base64回来
      

  19.   

    看明白了 编码 指的是文件或者流的编码什么编码的字节流需要用什么编码的Enconding来转换成字符串字节流间如何转换,最终用 YourEncoding.GetStrig(byte[] bytes)后得到的就是 "c# 的 string" 就是Unicode的你的问题 不是在如何转换字符串 如viena所说 字符串就是字符串 是unicode的字符序列。而时在Post的时候 
    header('Content-Type:text/html;charset=utf-8'); 
    如果你的页面出现乱码 , 那说明你的页面文件不是 utf-8的 把它用VS2005 或者 UtrlEdit等 另存为Utf-8如果是WinForm 或者 Console 程序
      
          byte[]  buffer = Encoding.Utf8.GetBytes( "name=huobazi&gender=boy" );//这里----------------------------------------
            HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create("http://www.domain/xxxx.aspx");
            WebReq.Method = "POST";
            WebReq.ContentType ="application/x-www-form-urlencoded";
            WebReq.ContentLength = buffer.Length;
            Stream PostData = WebReq.GetRequestStream();
            PostData.Write(buffer, 0, buffer.Length);
            PostData.Close();
            //... 
    如果是Ajax    var postData = "name=huobazi&gender=boy";
        postData = encodeURIComponent(post);  //这里----------------------------------------  
        var xmlObj = new ActiveXObject("Msxml2.XMLHTTP");
        var remoteUrl = "http://domain.com/xxx.aspx";    
        xmlObj.open("POST",remoteUrl,true);
        xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
        xmlObj.send(post);
        //... 
      

  20.   

    楼主语句写错了,
    string str;
    string msg;
    str = textBox1.Text;
    System.Text.Encoding GB2312 = System.Text.Encoding.GetEncoding("GB2312");
    System.Text.Encoding UTF8 = System.Text.Encoding.UTF8;
    byte[] data = GB2312.GetBytes(str);
    msg = UTF8.GetString(System.Text.Encoding.Convert(GB2312, UTF8, data));
    textBox2.Text = msg;最后一句话应该用utf8来获取字符串,而不是gb2312,,给分吧,呵呵,
    1
      

  21.   

    实践证明,lovedick的是错的。
      

  22.   


    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))); 
      

  23.   

    C#里的String只有一种,跟UTF8,GB2312什么的都没有关系。
    如果你已经得到了String对象,那就不需要知道是用什么编码的了。
    一般情况下,从文件或者网络读取到的都是字节数组,需要指定好按什么编码才能转化为String类型。
    对于lz的例子来说,str应该是String类型吧,那就over,没编码什么事了,只需要在需要输出到文件或网络时候指定一下编码格式就行了。
    lz需要确定一下,str是从哪里来的?如果是从文件中读取,那文件的编码是什么,有没有指定编码?
      

  24.   

    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
      

  25.   

    viena ()维也纳(wien)已经讲得很清楚了...
      

  26.   

    楼主还是没理解好自己要做什么。
    楼主之所以要转化是因为他认为自己要用UTF-8,所以要转化过来。
    实际上不是这回事,你拿到了string就是string,它是没有编码的,你直接   Response.Write(strTest); 就可以了
    Utf-8可以体现在你的 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 里面。
    关键的地方是你读取gb2312网页的时候没有用正确的编码,直接操作流就可以了。代码如下:myRequest = (HttpWebRequest)WebRequest.Create(fullUrl);
                myResponse = myRequest.GetResponse();
            Stream myStream = myResponse.GetResponseStream();
            StreamReader sr = new StreamReader(myStream, System.Text.Encoding.GetEncoding("gb2312"));
            sb.Append(sr.ReadToEnd());//----分割线----
    读取网页的时候编码是个不小的问题,stream的头没有编码信息,不像文件流那样头上带三个字节
    所以需要先把编码弄清楚才能正确读取,但是StreamReader需要首先设定编码才能读...而且中途不准改编码...
    我也是用了个比较危险的方法才解决了这个网页编码的问题
      

  27.   

    你拿到了string就是string,它是没有编码的
    --------------
    谁说string没有编码...VMM已经讲的很清楚了...怎么这么长时间还有这么多人不清楚...
    字符串是Unicode字符的有序集合字符串中的每个Unicode字符都是由Unicode标量值定义的,Unicode标量值也称为Unicode码位或者Unicode字符的序号(数字)值。每个码位都是使用UTF-16编码进行编码的,编码的每个元素的数值都用一个Char对象表示。string和char都是UTF-16编码...也就是说...只有非string和char形式存在的字符数据才有其它编码...即VMM一开始说的byte数组、流、文件等...
      

  28.   

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

  29.   

    字符串是Unicode字符的有序集合 字符串中的每个Unicode字符都是由Unicode标量值定义的,Unicode标量值也称为Unicode码位或者Unicode字符的序号(数字)值。每个码位都是使用UTF-16编码进行编码的,编码的每个元素的数值都用一个Char对象表示。 string和char都是UTF-16编码... 只有非string和char形式存在的字符数据才有其它编码================================================很好
      

  30.   

    我想问问你要转化的所谓的 “GB2312"串是怎么获得的?
    是从文本读入,还是流传过来?不会原来就是字符串吧!
    如果原来是字符串,你转换有什么用?
    字符串的话是不分编码的,只有流存在编码一说。
    这样的话,你就需要确定好流是什么编码。
    然后获得string对象,注意,这里的string只是单纯的string,
    不存在转码,只是把流的内容读入string。
    然后如果你需要转成utf-8的话,相信前面的方法你看得懂吧。
    这里也不需要转码,只是指定一下string输出流的编码罢了。
    所以,怎么会出现 "转换错误" ??
    还有如果你保存为文件的话,注意文件保存的编码。
    如果页面显示的话,注意页面的编码。
    ok?
      

  31.   

    string str = "韦儿天空";
    str= HttpUtility.UrlEncode(strBefore, Encoding.UTF8);这样就可以解决了,哎,可惜没分了
      

  32.   


    string str = "韦儿天空"; 
    str= HttpUtility.UrlEncode(str, Encoding.UTF8); 
    帖错了,再来一遍
      

  33.   

                    //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();
      

  34.   

    达梦科技特此证明:就只有don_gao说的是正确的,其他的都是扯旦。
      

  35.   

    再证明下:MichaelWhere的方法最简单明了。
      

  36.   

    其实LZ的问题很简单,就是得到了已经是乱码的字符串,怎么样才能让它正常显示出来!
    如,后台数据库为BIG5编码,如果用DataSet得到的数据集里的字符字段一定会显示乱码.怎么才能让它正常显示出来呢!因为前面大家都说String str="字符串",但实际是得到的str="^%$#*&%"或其它的乱码了,请问怎么才能把乱码正常显示出来呢??
      

  37.   

    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种编码互转而已。 貌似写完了 忘了
      

  38.   

    我也纠结这个问题  到底用什么呀
    我是URl 传值 到本页面    前台<%= %>绑定  
    同样出现乱码
      

  39.   

    .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字符的字节流。
      

  40.   

    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=
      

  41.   

    string str= System.Web.HttpUtility.UrlEncode("韦儿天空", Encoding.UTF8);一行搞定.
      

  42.   


    请教一个问题,如果有一个磁盘文件内容是“中文”,编码方式是 gb2312,使用string content = System.IO.File.ReadAllText("test.txt");那么 content 内部是什么状态呢