Conversion de UTF-8 EN ISO-8859-1 en Java - comment le garder en octet simple

j'essaie de convertir une chaîne codée en java en UTF-8 EN ISO-8859-1. Par exemple, dans la chaîne de caractères 'âabcd' '' â ' est représenté dans la norme ISO-8859-1 comme E2. En UTF-8, Il est représenté par deux octets. C3 A2 je crois. Quand je fais un GetBytes (encoding) et que je crée une nouvelle chaîne avec les octets de L'encodage ISO-8859-1, j'obtiens deux caractères différents. Un.¢ Y a-t-il une autre façon de le faire pour que le personnage reste le même, c'est-à-dire âabcd?

56
demandé sur Joachim Sauer 2009-03-17 23:25:06

8 réponses

si vous avez affaire à des codages de caractères autres que UTF-16, Vous ne devriez pas utiliser java.lang.String ou la primitive char -- vous ne devriez utiliser que des tableaux byte[] ou des objets ByteBuffer . Ensuite, vous pouvez utiliser java.nio.charset.Charset pour convertir entre les encodages:

Charset utf8charset = Charset.forName("UTF-8");
Charset iso88591charset = Charset.forName("ISO-8859-1");

ByteBuffer inputBuffer = ByteBuffer.wrap(new byte[]{(byte)0xC3, (byte)0xA2});

// decode UTF-8
CharBuffer data = utf8charset.decode(inputBuffer);

// encode ISO-8559-1
ByteBuffer outputBuffer = iso88591charset.encode(data);
byte[] outputData = outputBuffer.array();
93
répondu Adam Rosenfield 2013-08-29 15:13:00
byte[] iso88591Data = theString.getBytes("ISO-8859-1");

Fera l'affaire. D'après votre description, il semble que vous essayez de "stocker une chaîne ISO-8859-1". Les objets String en Java sont toujours implicitement encodés en UTF-16. Il n'y a aucun moyen de changer cet encodage.

Ce que vous pouvez faire, cependant, est d'obtenir les octets qui constituent un autre encodage (à l'aide de l' .méthode getBytes() comme indiqué ci-dessus).

31
répondu Joachim Sauer 2009-03-17 20:39:17

à partir D'un ensemble d'octets qui encodent une chaîne en utilisant UTF-8, crée une chaîne à partir de ces données, puis obtient quelques octets encodant la chaîne dans un encodage différent:

    byte[] utf8bytes = { (byte)0xc3, (byte)0xa2, 0x61, 0x62, 0x63, 0x64 };
    Charset utf8charset = Charset.forName("UTF-8");
    Charset iso88591charset = Charset.forName("ISO-8859-1");

    String string = new String ( utf8bytes, utf8charset );

    System.out.println(string);

    // "When I do a getbytes(encoding) and "
    byte[] iso88591bytes = string.getBytes(iso88591charset);

    for ( byte b : iso88591bytes )
        System.out.printf("%02x ", b);

    System.out.println();

    // "then create a new string with the bytes in ISO-8859-1 encoding"
    String string2 = new String ( iso88591bytes, iso88591charset );

    // "I get a two different chars"
    System.out.println(string2);

cette commande affiche correctement les chaînes et les octets iso88591:

âabcd 
e2 61 62 63 64 
âabcd

donc votre tableau d'octets n'était pas couplé avec le bon encodage:

    String failString = new String ( utf8bytes, iso88591charset );

    System.out.println(failString);

sorties

âabcd

(soit ça, soit vous venez a écrit la utf8 octets dans un fichier et de les lire ailleurs que utf88591)

7
répondu Pete Kirkham 2009-03-17 22:25:03

C'est ce dont j'avais besoin:

public static byte[] encode(byte[] arr, String fromCharsetName) {
    return encode(arr, Charset.forName(fromCharsetName), Charset.forName("UTF-8"));
}

public static byte[] encode(byte[] arr, String fromCharsetName, String targetCharsetName) {
    return encode(arr, Charset.forName(fromCharsetName), Charset.forName(targetCharsetName));
}

public static byte[] encode(byte[] arr, Charset sourceCharset, Charset targetCharset) {

    ByteBuffer inputBuffer = ByteBuffer.wrap( arr );

    CharBuffer data = sourceCharset.decode(inputBuffer);

    ByteBuffer outputBuffer = targetCharset.encode(data);
    byte[] outputData = outputBuffer.array();

    return outputData;
}
1
répondu Kåre Jonsson 2016-02-17 22:20:35

si vous avez le bon encodage dans la chaîne, vous n'avez pas besoin de faire plus pour obtenir les octets d'un autre encodage.

public static void main(String[] args) throws Exception {
    printBytes("â");
    System.out.println(
            new String(new byte[] { (byte) 0xE2 }, "ISO-8859-1"));
    System.out.println(
            new String(new byte[] { (byte) 0xC3, (byte) 0xA2 }, "UTF-8"));
}

private static void printBytes(String str) {
    System.out.println("Bytes in " + str + " with ISO-8859-1");
    for (byte b : str.getBytes(StandardCharsets.ISO_8859_1)) {
        System.out.printf("%3X", b);
    }
    System.out.println();
    System.out.println("Bytes in " + str + " with UTF-8");
    for (byte b : str.getBytes(StandardCharsets.UTF_8)) {
        System.out.printf("%3X", b);
    }
    System.out.println();
}

sortie:

Bytes in â with ISO-8859-1
 E2
Bytes in â with UTF-8
 C3 A2
â
â
0
répondu Paul Vargas 2014-03-12 05:10:04

pour les fichiers encodant...

public class FRomUtf8ToIso {
        static File input = new File("C:/Users/admin/Desktop/pippo.txt");
        static File output = new File("C:/Users/admin/Desktop/ciccio.txt");


    public static void main(String[] args) throws IOException {

        BufferedReader br = null;

        FileWriter fileWriter = new FileWriter(output);
        try {

            String sCurrentLine;

            br = new BufferedReader(new FileReader( input ));

            int i= 0;
            while ((sCurrentLine = br.readLine()) != null) {
                byte[] isoB =  encode( sCurrentLine.getBytes() );
                fileWriter.write(new String(isoB, Charset.forName("ISO-8859-15") ) );
                fileWriter.write("\n");
                System.out.println( i++ );
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileWriter.flush();
                fileWriter.close();
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }


    static byte[] encode(byte[] arr){
        Charset utf8charset = Charset.forName("UTF-8");
        Charset iso88591charset = Charset.forName("ISO-8859-15");

        ByteBuffer inputBuffer = ByteBuffer.wrap( arr );

        // decode UTF-8
        CharBuffer data = utf8charset.decode(inputBuffer);

        // encode ISO-8559-1
        ByteBuffer outputBuffer = iso88591charset.encode(data);
        byte[] outputData = outputBuffer.array();

        return outputData;
    }

}
0
répondu Frizz1977 2014-05-20 09:45:45

en plus de la réponse D'Adam Rosenfield, je voudrais ajouter que ByteBuffer.array() renvoie le tableau octet sous-jacent du buffer, qui n'est pas nécessairement" taillé " jusqu'au dernier caractère. Des manipulations supplémentaires seront nécessaires, comme celles mentionnées dans cette réponse "151940920; en particulier:

byte[] b = new byte[bb.remaining()]
bb.get(b);
0
répondu Chadi 2015-01-20 14:16:38

expulser non ISO-8859-1 caractères, sera remplacé par"?' (avant envoi à un ISO-8859-1 DB par exemple):

utf8String = new String (utf8String.GetBytes (), "ISO-8859-1");

-3
répondu bcros 2010-03-30 09:00:23