Java String.getBytes (charset) y la nueva cadena (bytes, juego de caracteres) con dos juegos de caracteres diferentes

ParkCheolu:

Por lo que yo sé, en String.getBytes (charset), el argumento, medios de conjunto de caracteres que el método devuelve bytes de una cadena codificada como el conjunto de caracteres dado.

En la nueva cadena de caracteres (bytes, charset), el segundo argumento, los medios de conjunto de caracteres que las decodificaciones método bytes como el conjunto de caracteres y vuelve dado el resultado decodificado.

De acuerdo con lo anterior, y como mi entender, los argumentos de conjunto de caracteres de los dos métodos diferentes deben ser los mismos para que la nueva cadena (bytes, juego de caracteres) puede devolver una cadena adecuada. (Supongo que esto es lo que me falta.)

Tengo una cadena incorrectamente decodificados y he probado el siguiente código con esto:

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

La salida es:

[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] = ?×½ºÆ®

Como se puede ver, que descubra el camino de conseguir la cadena original:

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

¿Cómo puede ser posible? ¿Cómo puede la cadena se codifica y decodifica correctamente como diferentes juegos de caracteres?

Holger:

De acuerdo con lo anterior, y como mi entender, los argumentos de conjunto de caracteres de los dos métodos diferentes deben ser los mismos para que la nueva cadena (bytes, juego de caracteres) puede devolver una cadena adecuada.

Eso es lo que debe tener como objetivo, para escribir código correcto. Pero esto no implica que cada operación incorrecta siempre producirá resultados erróneos. Un ejemplo sencillo sería una cadena que consta de sólo letras ASCII. Una gran cantidad de codificaciones producir la misma secuencia de bytes de una cadena de este tipo, por lo que una prueba utilizando sólo una cadena de este tipo no es suficiente para detectar los errores de codificación relacionados.

Como se puede ver, que descubra el camino de conseguir la cadena original:

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

¿Cómo puede ser posible? ¿Cómo puede la cadena se codifica y decodifica correctamente como diferentes juegos de caracteres?

Bueno, cuando yo haga

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

en mi máquina, se imprime true. O, si ejecuto

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

imprime

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

Así que para euc-kry ksc5601, la respuesta es simple. Estos son diferentes nombres para el mismo codificación de caracteres.

Para x-windows-949, tengo que recurrir a Wikipedia :

Unificados Código Hangul (UHC), o extendido Wansung, también conocido bajo Microsoft Windows como página de códigos 949 (Windows-949, MS949 o ambigua CP949), es la página de códigos de Microsoft Windows para el idioma coreano. Es una extensión de Wansung Código (KS C 5601: 1987, codificada como EUC-KR) para incluir todos 11172 Hangul sílabas presentes en Johab (KS C 5601: 1992 Anexo 3).

Por lo tanto, es una extensión de ksc5601lo que dará lugar al mismo resultado, siempre y cuando no se está usando cualquier carácter affacted por la extensión (pensar en el ejemplo ASCII arriba).

En general, esto no le invalida premisa. Resultados correctos sólo se garantiza cuando se utiliza la misma codificación para ambos lados. Significa sólo, probar código es mucho más difícil, ya que requiere datos de entrada de prueba suficientes para detectar errores. Por ejemplo, un error común en el mundo occidental, es confundir la norma ISO-Latin-1 (ISO 8859-1) con Windows página de códigos 1252, que no pueden quedar manchado de texto simple.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=210931&siteId=1
Recomendado
Clasificación