javaはinput streamから伝わってくる中文字を受信して、ある文字の文字化け問題が現れます.
4709 ワード
1.第一の場合
サーバとクライアントのコードが統一されていないため、中国語の文字化が乱れてしまいました.サーバがデータをUTF-8形式に戻す場合、クライアントは入力ストリームを読む時、UTF-8形式に変換する必要があります.クライアントの部分コードを見てください.
new String(b,"gb 2312")に変更した場合の結果を図10-18に示す.
中国語の文字化け問題を避けるには、まず、頻繁にトランスコードしないでください.そして、最後に自分もどこに行ったか分かりません.次に、クライアントプログラムのコードとサーバーコードを統一してください.また、中国語の文字列をバイトで読み取らないようにしてください.開発中に1バイトの読み取りがあり、半分の文字が読み取れば、文字化けが発生します.
2.第二の場合
中国語の漢字の中には一部の中国語の文字化けが現れます.このような現象は見たところとても奇怪で、よく開発の過程の中で、読者はすべてこのように操作するかもしれなくて、しかし発見していません.このような現象はどうやってもたらしたのですか?例のプログラムを先に見ます.
例:
ファイルを読み込むコアコードは以下の通りです.
一部の文字化けの現象が現れました.理由は先に言わないで、コードを変えてから効果を見ます.byte buffer[]=new byte[100]をbyte buffer[]=new byte[inputStream.available()に変更し、運転後の効果を図10-20に示します.
考えてみます.100とinputStream.availableの違いには、中国語の部分が文字化けしているという問題がありますか?なぜなら、100バイトを読む時、ちょうど漢字の前半バイトに出会う可能性があります.後100バイトの第一位置のバイトもこの字の後半バイトです.半バイトは漢字ですか?これで当然文字化けが発生します.バイトの配列を直接入力ストリームの長さに設定し、読み取り時に一度に読み込むと、いわゆる半文字現象が発生しなくなります.もちろん、文字化けの問題もありません.
もう一つの解決方法はバイトでファイルを読み込まず、文字で読み、漢字を一つ入れるのが合法です.コードを見てください.
[java]view plin copy
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);
サーバとクライアントのコードが統一されていないため、中国語の文字化が乱れてしまいました.サーバがデータを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();
}`