ジャワするString.getBytes(文字セット)と2つの異なる文字セットを使用して新しい文字列(バイト、文字セット)

ParkCheolu:

私の知る限りでは、するString.getBytes(文字セット)、引数、文字セット手段にメソッド戻り、所定の文字セットとしてエンコードされた文字列のバイトこと。

新しい文字列(バイト、文字セット)では、方法は、復号化することを第二の引き数、文字セット手段は、所定の文字セットとしてバイト、復号結果を返します。

上記によると、その新しい文字列(バイト、文字セットが)適切な文字列を返すことができますので、私の理解として、二つの異なる方法のcharset引数は同じでなければなりません。(私はここで推測し、私が欠けているものです。)

私は間違ってデコードされた文字列を持っていると私はこれで、次のコードをテストしました:

String originalStr = "Å×½ºÆ®"; // 테스트 
String [] charSet = {"utf-8","euc-kr","ksc5601","iso-8859-1","x-windows-949"};

for (int i=0; i<charSet.length; i++) {
 for (int j=0; j<charSet.length; j++) {
  try {
   System.out.println("[" + charSet[i] +"," + charSet[j] +"] = " + new String(originalStr.getBytes(charSet[i]), charSet[j]));
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }
 }
}

出力は次のようになります。

[utf-8,utf-8] = Å×½ºÆ®
[utf-8,euc-kr] = ��쩍쨘�짰
[utf-8,ksc5601] = ��쩍쨘�짰
[utf-8,iso-8859-1] = Å×½ºÆ®
[utf-8,x-windows-949] = 횇횞쩍쨘횈짰
[euc-kr,utf-8] = ?����������
[euc-kr,euc-kr] = ?×½ºÆ®
[euc-kr,ksc5601] = ?×½ºÆ®
[euc-kr,iso-8859-1] = ?¡¿¨ö¨¬¨¡¢ç
[euc-kr,x-windows-949] = ?×½ºÆ®
[ksc5601,utf-8] = ?����������
[ksc5601,euc-kr] = ?×½ºÆ®
[ksc5601,ksc5601] = ?×½ºÆ®
[ksc5601,iso-8859-1] = ?¡¿¨ö¨¬¨¡¢ç
[ksc5601,x-windows-949] = ?×½ºÆ®
[iso-8859-1,utf-8] = �׽�Ʈ
[iso-8859-1,euc-kr] = 테스트
[iso-8859-1,ksc5601] = 테스트
[iso-8859-1,iso-8859-1] = Å×½ºÆ®
[iso-8859-1,x-windows-949] = 테스트
[x-windows-949,utf-8] = ?����������
[x-windows-949,euc-kr] = ?×½ºÆ®
[x-windows-949,ksc5601] = ?×½ºÆ®
[x-windows-949,iso-8859-1] = ?¡¿¨ö¨¬¨¡¢ç
[x-windows-949,x-windows-949] = ?×½ºÆ®

あなたが見ることができるように、私は、元の文字列を取得する方法を考え出します:

[iso-8859-1,euc-kr] = 테스트  
[iso-8859-1,ksc5601] = 테스트  
[iso-8859-1,x-windows-949] = 테스트 

どのようにそれが可能になることができますか?どのように文字列は、異なるキャラクタ・セットとして適切にエンコードおよびデコードすることができますか?

ホルガー:

上記によると、その新しい文字列(バイト、文字セットが)適切な文字列を返すことができますので、私の理解として、二つの異なる方法のcharset引数は同じでなければなりません。

それは正しいコードを書くために、あなたがで目指すべきものです。しかし、これは、すべての間違った操作は常に間違った結果を生成することを意味するものではありません。簡単な例では唯一のASCII文字からなる文字列になります。のみ、このようなAの文字列を使用してテストは、関連するエラーをコード発見するのに十分ではありませんので、エンコーディングの多くは、そのような文字列の同じバイトシーケンスを生成します。

あなたが見ることができるように、私は、元の文字列を取得する方法を考え出します:

[iso-8859-1,euc-kr] = 테스트  
[iso-8859-1,ksc5601] = 테스트  
[iso-8859-1,x-windows-949] = 테스트 

どのようにそれが可能になることができますか?どのように文字列は、異なるキャラクタ・セットとして適切にエンコードおよびデコードすることができますか?

まあ、私は、実行時に

System.out.println(Charset.forName("euc-kr") == Charset.forName("ksc5601"));

私のマシン上で、それが印刷さtrueそれとも、私が実行している場合

System.out.println(Charset.forName("euc-kr").aliases());

それを印刷

[ksc5601-1987, csEUCKR, ksc5601_1987, ksc5601, 5601, euc_kr, ksc_5601, ks_c_5601-1987, euckr]

そうするためにeuc-krksc5601、答えは簡単です。これらは、同じ文字エンコーディングのための別の名前です。

以下のためにx-windows-949、私はに頼る必要がありウィキペディア

また、コードページ949(Windowsの-949、MS949または曖昧CP949)としてMicrosoft Windowsで知られているハングルコード(UHC)、または拡張Wansungを、統一、韓国語用のMicrosoft Windowsのコードページです。JOHAB(:1992附属書3 KS C 5601)内のすべての11172ハングルシラブル存在を含むこと:Wansungコード(1987、EUC-KRとしてエンコードKS C 5601)の拡張です。

それが延長されるようにksc5601拡張子によってaffacted任意の文字を使用していない限り、同じ結果につながる(ASCII例以上を考えます)。

一般的に、これはあなたの前提が無効になることはありません。両側に同じ符号を使用する場合、正しい結果のみ保証されます。それだけの手段、それがエラーを発見するのに十分なテスト入力データを必要とするようなコードをテストすることは、はるかに困難です。例えば、西洋世界では一般的なエラー、単純なテキストで発見されないことがあり、Windowsのコードページ1252でのISO-Latin-1(ISO 8859-1)混同することです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=210928&siteId=1