ホームページ >Java >&#&ベース >Javaでbyte[]をStringに変換すると文字化けが発生する

Javaでbyte[]をStringに変換すると文字化けが発生する

王林
王林オリジナル
2019-11-27 09:28:0010409ブラウズ

Javaでbyte[]をStringに変換すると文字化けが発生する

まず、一般的に使用される byte[] を String に直接変換するのは非常に簡単です:

public static void main(String[] args) {  
String str="我是中国人";  
byte[] arr=str.getBytes();  
System.out.println("打印:"+arr);
for(byte e : arr) {
System.out.print(e + " ");
}
String str2=new String(arr);  
System.out.println("\n打印2:"+str2);  
}

Java 関連のビデオの推奨事項: Java learning

たとえば、上記の出力結果は次のとおりです。

打印:[B@15db9742
-50 -46 -54 -57 -42 -48 -71 -6 -56 -53 
打印2:我是中国人

これを見ると、エンコーディングがわかります。 byte は 1 バイト、漢字は 2 バイトです。したがって、5 つの漢字には 10 バイト タイプのデジタル ストレージが必要です。次に、数字が漢字に変換され、標準化のプロセスが行われます。

では、Java は文字エンコーディングをどのように処理するのでしょうか?

JAVA は独自の String クラスを使用するため、String クラス オブジェクトはコーディング テーブルを指定する必要がありません。なぜ、一連の数字がそれぞれどの文字を表しているのかを知ることができるのでしょうか?これは、String 内の文字情報が UNICODE エンコードで格納されているためです。文字(単一の文字であることに注意してください)を表現するために、JAVA には char データ型もあり、そのサイズは 8 桁の 16 進数 2 桁の固定長で、0 ~ 65535 です。その目的は、UNICODE の文字に対応させることです。

文字列内の UNICODE 番号を取得したい場合は、getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) メソッドを使用して char[] を取得できます。 、この char[] は、UNICODE エンコード テーブルに従ってエンコードされた String 文字、数値を表します。

byte[ ] を String に変換するとコードが文字化けするのはなぜですか?

明らかに、上で述べたように、コーディング標準は異なります。たとえば、GB2312 標準における中国語の単語「dang」は、2 つの 8 桁の数字 0xB5 と 0xB1 で表されます。英語のシステムには GB2312 エンコーディング テーブルがないため、0xB5、0xB1 を与えると ASCII として扱われます。 Javaに入れると独自のUNICODE仕様に従って処理するため、仕様が異なると文字化けというおかしな結果が出てしまいます。

では、byte[] を String に変換する際の文字化けの問題を解決するにはどうすればよいでしょうか?

byte[] がどこから来たかによって異なります。他の場所に送信するためにピクチャを byte[] に変換し、次に String ストリーム オブジェクトに変換する必要があることがよくありますが、受信側はそれを byte[] に変換してからピクチャに変換します。

1. byte[] を直接送信する場合、byte[] が長すぎるとデータ損失が発生します。すべてのバイトの組み合わせを char にマッピングできるわけではないためです。

2. 共通の Base64 エンコーディング仕様を使用します。 Base64 のエンコード仕様は、一般的な文字を 6 ビットのバイナリ表現に変換することです (64 が一般的に使用されるため、base64 と呼ばれます)。書き方としては、以下のような既製のツールクラスがあります。

import org.apache.commons.codec.binary.Base64;  
public class UtilHelper {     
    //base64字符串转byte[]  
    public static byte[] base64String2ByteFun(String base64Str){  
        return Base64.decodeBase64(base64Str);  
    }  
    //byte[]转base64  
    public static String byte2Base64StringFun(byte[] b){  
        return Base64.encodeBase64String(b);  
    }  
}

これにより、byte[] と String 間の標準的な変換が保証されます。

その他の関連記事とチュートリアルをお勧めします: Java ゼロベース入門

以上がJavaでbyte[]をStringに変換すると文字化けが発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。