javaはinput streamから伝わってくる中文字を受信して、ある文字の文字化け問題が現れます.

4709 ワード

1.第一の場合
サーバとクライアントのコードが統一されていないため、中国語の文字化が乱れてしまいました.サーバがデータをUTF-8形式に戻す場合、クライアントは入力ストリームを読む時、UTF-8形式に変換する必要があります.クライアントの部分コードを見てください.
………………..      ………………    
//   URL          
url = new URL("http://192.168.1.7:8080/exa/zh_cn");    
httpurlconnection = (HttpURLConnection) url.openConnection();    
//                
inputStream = httpurlconnection.getInputStream();    
String strResult="";    
byte[] b = new byte[1024];    
int i = 0;    
while ((i = inputStream.read(b)) != -1) {    
    strResult+=new String(b,"utf-8");    
    b = new byte[1024];    
}     
//          
textView_1.setText(strResult);    
………………      ………………    
コードのキーコードは、new String(b,「utf-8」)であり、byte配列をUTF-8形式の文字列に変換した結果を図10-17に示す.
new String(b,"gb 2312")に変更した場合の結果を図10-18に示す.
中国語の文字化け問題を避けるには、まず、頻繁にトランスコードしないでください.そして、最後に自分もどこに行ったか分かりません.次に、クライアントプログラムのコードとサーバーコードを統一してください.また、中国語の文字列をバイトで読み取らないようにしてください.開発中に1バイトの読み取りがあり、半分の文字が読み取れば、文字化けが発生します.
2.第二の場合
中国語の漢字の中には一部の中国語の文字化けが現れます.このような現象は見たところとても奇怪で、よく開発の過程の中で、読者はすべてこのように操作するかもしれなくて、しかし発見していません.このような現象はどうやってもたらしたのですか?例のプログラムを先に見ます.
例:
ファイルを読み込むコアコードは以下の通りです.
………………..      ………………    
inputStream = this.getAssets().open("test.txt");    
byte buffer[] = new byte[100];    
StringBuffer sb = new StringBuffer();    
int i = 0;    
while ((i = inputStream.read(buffer)) != -1) {    
    sb.append(new String(buffer, 0, i));    
}    
textView_1.setText(sb.toString());    
………………..      ………………   
上記のコードによる効果を図10-19に示します.
一部の文字化けの現象が現れました.理由は先に言わないで、コードを変えてから効果を見ます.byte buffer[]=new byte[100]をbyte buffer[]=new byte[inputStream.available()に変更し、運転後の効果を図10-20に示します.
考えてみます.100とinputStream.availableの違いには、中国語の部分が文字化けしているという問題がありますか?なぜなら、100バイトを読む時、ちょうど漢字の前半バイトに出会う可能性があります.後100バイトの第一位置のバイトもこの字の後半バイトです.半バイトは漢字ですか?これで当然文字化けが発生します.バイトの配列を直接入力ストリームの長さに設定し、読み取り時に一度に読み込むと、いわゆる半文字現象が発生しなくなります.もちろん、文字化けの問題もありません.
もう一つの解決方法はバイトでファイルを読み込まず、文字で読み、漢字を一つ入れるのが合法です.コードを見てください.
[java]view plin copy
………………..      ………………    
inputStream = this.getAssets().open("test.txt");    
StringBuffer sb = new StringBuffer();    
InputStreamReader isr=new InputStreamReader(inputStream);    
char buf[] = new char[20];    
int nBufLen = isr.read(buf);    
while(nBufLen!=-1){    
    sb.append(new String(buf, 0, nBufLen));    
    nBufLen = isr.read(buf);    
}    
textView_1.setText(sb.toString());    
………………..      ………………    
以上はネット友達の例で、点を見た後に、博主は自分で問題を解決しました.
ps:これは処理済みの方法です.public static String sendPost{String url、String param){DataOutututututStreamout=null;Buffreader reader=null;StrigBurer reult=new StringBuffer(");try{/接続URL realalalalalalalalalalalininininininininctctction====nultion;StortttttttttconcontrtrtrtrtrtrtrtrtrininininininininingggggggttttttttttttttttttttttttttttttttttttttOutput(true);connection.set DoInput(true);connect.set Request Method(「POST」);connection.sets UseCacheces(false);connection.set Instance FollowRedicts(true);
            connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
            connection.setRequestProperty("Accept-Charset", "utf-8");
//connect.Connect Timeout(3000)、/3秒接続タイムアウト/connect.set ReadTimeout(3000)、/3秒読み出しタイムアウトconnect.set Request Property(「Charet」、「utf-8」)、connect.co.net().
            //POST  
            out =  new DataOutputStream(connection.getOutputStream());
            out.writeBytes(param);
            out.flush();
           // out.write(param.getBytes());

            //    
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
            //      ,              
            char buf[] = new char[20];
            int nBufLen = reader.read(buf);    
            while(nBufLen!=-1){    
                result.append(new String(buf, 0, nBufLen));    
                nBufLen = reader.read(buf);    
            }  

            //     
            connection.disconnect();
        } catch (UnsupportedEncodingException e) {
            System.out.println("Message=="+e.getMessage());
           // e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Message=="+e.getMessage());
            //e.printStackTrace();
        }
     finally {  
          try {  
              if (out != null) {  

              }  
              if (reader != null) {  
                  reader.close();  
              }  
          } catch (IOException ex) {
              ex.printStackTrace();  
          }  
      }

     return result.toString();  
}`