3 votes

Convertir Windows-1252 en UTF-16 en Java

J'essaie de convertir tous les caractères spéciaux de Windows en leur équivalent Unicode. Nous avons une application Flex, dans laquelle un utilisateur enregistre un texte enrichi, qui est ensuite envoyé par courriel à son destinataire par le biais d'un Emailer Java. Cependant, nous nous heurtons constamment aux caractères spéciaux de Word qui apparaissent dans l'e-mail sous la forme d'un ?

Jusqu'à présent, j'ai essayé

 private String replaceWordChars(String text_in) {
    String s = text_in;

    // smart single quotes and apostrophe
    s = s.replaceAll("[\\u2018|\\u2019|\\u201A]", "\'");
    // smart double quotes
    s = s.replaceAll("[\\u201C|\\u201D|\\u201E]", "\"");
    // ellipsis
    s = s.replaceAll("\\u2026", "...");
    // dashes
    s = s.replaceAll("[\\u2013|\\u2014]", "-");
    // circumflex
    s = s.replaceAll("\\u02C6", "^");
    // open angle bracket
    s = s.replaceAll("\\u2039", "<");
    // close angle bracket
    s = s.replaceAll("\\u203A", ">");
    // spaces
    s = s.replaceAll("[\\u02DC|\\u00A0]", " ");

    return s;

Ce qui fonctionne, mais je ne veux pas encoder à la main tous les caractères Windows-1252 vers leur équivalent UTF-16 (en supposant que ce soit le jeu de caractères par défaut de Java).

Cependant, nos utilisateurs continuent à trouver de nouveaux caractères dans Microsoft Word que Java ne peut tout simplement pas gérer. J'ai donc cherché et cherché, et j'ai trouvé cet exemple

private String replaceWordChars(String text_in) {
    String s = text_in;
    try {
        byte[] b = s.getBytes("Cp1252");
        byte[] encoded = new String(b, "Cp1252").getBytes("UTF-16");
        s = new String(encoded, "UTF-16");

    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return s;

Mais lorsque je regarde l'encodage se dérouler dans le débogueur Eclipse, rien ne change.

Il doit y avoir une solution simple pour traiter le joli encodage de Microsoft avec Java.

Qu'en pensez-vous ?

4voto

laz Points 12212

Vous pouvez essayer d'utiliser java.nio.charset.Charset :

final Charset windowsCharset = Charset.forName("windows-1252");
final Charset utfCharset = Charset.forName("UTF-16");
final CharBuffer windowsEncoded = windowsCharset.decode(ByteBuffer.wrap(new byte[] {(byte) 0x91}));
final byte[] utfEncoded = utfCharset.encode(windowsEncoded).array();
System.out.println(new String(utfEncoded, utfCharset.displayName()));

2voto

Brian Points 7975

Procédez comme suit :

  1. Créer un InputStreamReader en utilisant l'encodage du fichier source (Windows-1252)
  2. Créer un OutputStreamWriter en utilisant l'encodage du fichier de destination (UTF-16)
  3. Copier les informations lues par le lecteur vers le rédacteur. Vous pouvez utiliser BufferedReader y BufferedWriter pour écrire le contenu ligne par ligne.

Votre code peut donc ressembler à ceci :

public void reencode(InputStream source, OutputStream dest,
        String sourceEncoding, String destEncoding)
        throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(source, sourceEncoding));
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dest, destEncoding));
    String in;
    while ((in = reader.readLine()) != null) {
        writer.write(in);
        writer.newLine();
    }
}

Bien entendu, cela exclut les fonctions try/catch et les délègue à l'appelant.

Si vous essayez simplement d'obtenir le contenu sous la forme d'une chaîne de caractères, vous pouvez remplacer le paramètre writer con StringWriter et renvoie son toString valeur. Dans ce cas, vous n'avez pas besoin d'un flux de destination ou d'un encodage, mais simplement d'un endroit où déposer les caractères :

public String decode(InputStream source, String sourceEncoding)
        throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(source, sourceEncoding));
    StringWriter writer = new StringWriter();
    String in;
    while ((in = reader.readLine()) != null) {
        writer.write(in);
        writer.write('\n'); // Java newline should be fine, test this just in case
    }
    return writer.toString();
}

1voto

idonaldson Points 147

Ce qui semble fonctionner jusqu'à présent pour tout ce que j'ai testé est :

private String replaceWordChars(String text_in) {
    String s = text_in;

    final Charset windowsCharset = Charset.forName("windows-1252");
    final Charset utfCharset     = Charset.forName("UTF-16");

    byte[] incomingBytes = s.getBytes();
    final CharBuffer windowsEncoded = 
        windowsCharset.decode(ByteBuffer.wrap(incomingBytes)); 

    final byte[] utfEncoded = utfCharset.encode(windowsEncoded).array();
    s = new String(utfEncoded);

    return s;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X