2017-06-09 2 views
0

Nous implémentons une fonctionnalité pour prendre en charge les caractères non imprimables de UTF-8 dans notre base de données. Notre système les stocke dans la base de données et les récupère. Nous collectons des entrées sous la forme de base 64, les convertissons en tableau d'octets et les stockons dans la base de données. Pendant la récupération, la base de données nous donne le tableau d'octets et nous les convertissons en base 64 à nouveau. Pendant le processus de récupération (après que db nous ait fourni le tableau d'octets), tous les attributs sont convertis en tableaux de chaînes, puis ils sont à nouveau convertis en tableau d'octets et sont à nouveau convertis en base 64 pour le rendre à utilisateur.Caractères non imprimables de UTF-8 - SUSE Linux Java ne prend pas en charge

Le code ci-dessous compile et fonctionne correctement dans notre JDK Windows (version Java 8). Mais quand cela est placé dans l'environnement SuSe Linux, nous voyons des caractères étranges.

public class Tewst { 


public static void main(String[] args) { 
    byte[] attributeValues; 
    String utfString ; 

    attributeValues = new byte[]{-86, -70, -54, -38, -6}; 
    if (attributeValues != null) { 
     utfString = new String(attributeValues); 
     System.out.println("The string is "+utfString); 
    } 
} 

}

La sortie donnée est

"La chaîne est ªºÊÚú"

Maintenant, lorsque le même fichier est exécuté sur la distribution SuSe Linux, il me donne:

"La chaîne est "

Nous utilisons Java 8 dans Windows et Linux. Quel est le problème qu'il ne s'exécute pas correctement sous Linux? D'ailleurs, nous avons aussi essayé `utfString = new String (attributeValues," UTF-8 "); . Cela n'a pas aidé de toute façon. Qu'est-ce qui nous manque?

+0

Je suppose que cela n'a rien à voir avec le programme Java, mais avec la police que vous utilisez pour imprimer la chaîne. – Henry

+0

Si tel est le cas, lorsque la chaîne est reconvertie en tableau d'octets, elle doit donner le tableau d'octets d'origine, mais elle donne quelque chose d'autre et non le tableau d'octets d'origine. Nous obtenons 15 valeurs au lieu de 5 dans le tableau d'octets. – javaShilp

+2

Pouvez-vous afficher le code pour ce test de conversion? – Henry

Répondre

1

Les caractères ªºÊÚú sont Unicode 00AA 00BA 00CA 00DA 00FA.

Dans le jeu de caractères ISO-8859-1, c'est-à-dire AA BA CA DA FA.
En décimal, ce serait {-86, -70, -54, -38, -6}, comme vous l'avez dans votre code. Ainsi, votre chaîne est encodée en ISO-8859-1, pas en UTF-8, ce qui explique pourquoi elle ne fonctionne pas sous Linux, car Linux utilise UTF-8, tandis que Windows utilise ISO-8859-1.

Ne jamais utilisernew String(byte[]), sauf si vous êtes absolument sûr que vous voulez que le jeu de caractères par défautde la machine virtuelle Java, quel qu'il soit.

Modifier le code en new String(attributeValues, StandardCharsets.ISO_8859_1). En outre, dans l'opération inverse, utilisez str.getBytes(StandardCharsets.ISO_8859_1).
Ensuite, devrait fonctionner de manière cohérente sur diverses plates-formes, puisque le code n'utilise plus les valeurs par défaut de la plate-forme.

+0

Ça a marché !!! :) Merci beaucoup. Je pense que nous avons l'impression que nous utilisons l'encodage UTF-8 et que nous avons juste réalisé que notre encodage n'est pas UTF-8. Merci Andreas. – javaShilp