java ¿Por qué "STRING".getBytes() funciona de manera diferente según el sistema operativo?



ascii ebcdic (1)

No está especificando un conjunto de caracteres al llamar a getBytes() , por lo que utiliza el conjunto de caracteres predeterminado de la plataforma subyacente (o de Java en sí si se especifica cuando se inicia Java). Esto se indica en la documentación de String :

byte público [] getBytes ()

Codifica esta cadena en una secuencia de bytes utilizando el juego de caracteres predeterminado de la plataforma , almacenando el resultado en una nueva matriz de bytes.

getBytes() tiene una versión sobrecargada que le permite especificar un juego de caracteres en su código.

byte público [] getBytes (Charset charset)

Codifica esta cadena en una secuencia de bytes utilizando el juego de caracteres dado , almacenando el resultado en una nueva matriz de bytes.

Estoy ejecutando el código a continuación y estoy obteniendo resultados diferentes de "some_string" .getBytes () dependiendo de si estoy en Windows o Unix. El problema ocurre con cualquier cadena (probé un ABC muy simple y el mismo problema.

Vea las diferencias a continuación impresas en la consola.

El código siguiente está bien probado utilizando Java 7. Si lo copias completamente, se ejecutará.

Además, vea la diferencia en hexadecimal en las dos imágenes a continuación. Las dos primeras imágenes muestran el archivo creado en Windows. Puede ver los valores hexadecimales con ANSI y EBCDIC respectivamente. La tercera imagen, la negra, es de Unix. Puede ver el hexadecimal (opción -c) y el carácter legible en el que creo que es EBCDIC.

Entonces, mi pregunta directa es: ¿por qué ese código funciona diferente ya que solo estoy usando Java 7 en ambos casos? ¿Debo consultar alguna propiedad específica en alguna parte? Tal vez, Java en Windows obtiene cierto formato predeterminado y en Unix obtiene otro. Si es así, ¿qué propiedad debo verificar o configurar?

Consola de Unix:

$ ./java -cp /usr/test.jar test.mainframe.read.test.TestGetBytes
H = 76 - L
< wasn't found

Consola de Windows:

H = 60 - <
H1 = 69 - E
H2 = 79 - O
H3 = 77 - M
H4 = 62 - >
End of Message found

El código completo:

package test.mainframe.read.test;

import java.util.ArrayList;

public class TestGetBytes {

       public static void main(String[] args) {
              try {
                     ArrayList ipmMessage = new ArrayList();
                     ipmMessage.add(newLine());

                     //Windows Path
                     writeMessage("C:/temp/test_bytes.ipm", ipmMessage);
                     reformatFile("C:/temp/test_bytes.ipm");
                     //Unix Path
                     //writeMessage("/usr/temp/test_bytes.ipm", ipmMessage);
                     //reformatFile("/usr/temp/test_bytes.ipm");
              } catch (Exception e) {

                     System.out.println(e.getMessage());
              }
       }

       public static byte[] newLine() {
              return "<EOM>".getBytes();
       }

       public static void writeMessage(String fileName, ArrayList ipmMessage)
                     throws java.io.FileNotFoundException, java.io.IOException {

              java.io.DataOutputStream dos = new java.io.DataOutputStream(
                           new java.io.FileOutputStream(fileName, true));
              for (int i = 0; i < ipmMessage.size(); i++) {
                     try {
                           int[] intValues = (int[]) ipmMessage.get(i);
                           for (int j = 0; j < intValues.length; j++) {
                                  dos.write(intValues[j]);
                           }
                     } catch (ClassCastException e) {
                           byte[] byteValues = (byte[]) ipmMessage.get(i);
                           dos.write(byteValues);
                     }
              }
              dos.flush();
              dos.close();

       }

       // reformat to U1014
       public static void reformatFile(String filename)
                     throws java.io.FileNotFoundException, java.io.IOException {
              java.io.FileInputStream fis = new java.io.FileInputStream(filename);
              java.io.DataInputStream br = new java.io.DataInputStream(fis);

              int h = br.read();
              System.out.println("H = " + h + " - " + (char)h);

              if ((char) h == '<') {// Check for <EOM>

                     int h1 = br.read();
                     System.out.println("H1 = " + h1 + " - " + (char)h1);
                     int h2 = br.read();
                     System.out.println("H2 = " + h2 + " - " + (char)h2);
                     int h3 = br.read();
                     System.out.println("H3 = " + h3 + " - " + (char)h3);
                     int h4 = br.read();
                     System.out.println("H4 = " + h4 + " - " + (char)h4);
                     if ((char) h1 == 'E' && (char) h2 == 'O' && (char) h3 == 'M'
                                  && (char) h4 == '>') {
                           System.out.println("End of Message found");
                     }
                     else{
                           System.out.println("EOM not found but < was found");
                     }
              }
              else{
                     System.out.println("< wasn't found");
              }
       }
}




ebcdic