2009-05-07 6 views
3

Je suis en train de déboguer quelque chose et je me demande si le code suivant pourrait jamais revenir vraiUne chaîne Java vide peut-elle être créée à partir d'un tableau d'octets UTF-8 non vide?

public boolean impossible(byte[] myBytes) { 
    if (myBytes.length == 0) 
    return false; 
    String string = new String(myBytes, "UTF-8"); 
    return string.length() == 0; 
} 

Y at-il une valeur que je peux passer qui renverra vrai? J'ai joué avec le premier octet d'une séquence de deux octets, mais il produit toujours une seule chaîne de caractères.

Pour clarifier, cela s'est produit sur une puce PowerPC sur le code Java 1.4 compilé par GCJ à un exécutable binaire natif. Cela signifie essentiellement que la plupart des paris sont désactivés. Je me demande surtout si le comportement «normal» de Java ou les spécifications de Java ont fait des promesses.

Répondre

0

UTF-8 est un schéma de codage à longueur variable, avec la plupart des caractères «normaux» à un seul octet. Donc tout octet non vide donné [] se traduira toujours par une chaîne, j'aurais pensé. Si vous voulez lire, écrivez un test unitaire qui répète sur toutes les valeurs d'octets possibles, en passant dans un tableau à valeur unique de cette valeur, et affirmez que la chaîne n'est pas vide.

1

Peut-être. A partir des documents de l'API Java 5 "Le comportement de ce constructeur lorsque les octets donnés ne sont pas valides dans le jeu de caractères donné n'est pas spécifié."

Je suppose que cela dépend de: Quelle est la version de Java que vous utilisez quel fournisseur a écrit votre machine virtuelle Java (Sun, HP, IBM, l'open source un, etc.)

Une fois que les documents disent « non spécifié "tous les paris sont ouverts

Edit: Battu à par Trey Prendre ses conseils sur l'utilisation d'un CharsetDecoder

1

Si Java gère correctement l'BOM mark (que je ne sais pas s'ils ont encore fixé il), puis il devrait être possible d'inpu t un tableau d'octets avec juste la nomenclature (U + FEFF, qui est en UTF-8 la séquence d'octets EF BB BF) et obtenir une chaîne vide.


Mise à jour:

J'ai testé cette méthode avec toutes les valeurs de 1-3 octets. Aucun d'entre eux n'a renvoyé une chaîne vide sur Java 1.6. Voici le code de test que j'ai utilisé avec différentes longueurs de tableau d'octets:

public static void main(String[] args) throws UnsupportedEncodingException { 
    byte[] test = new byte[3]; 
    byte[] end = new byte[test.length]; 

    if (impossible(test)) { 
     System.out.println(Arrays.toString(test)); 
    } 
    do { 
     increment(test, 0); 
     if (impossible(test)) { 
      System.out.println(Arrays.toString(test)); 
     } 
    } while (!Arrays.equals(test, end)); 

} 

private static void increment(byte[] arr, int i) { 
    arr[i]++; 
    if (arr[i] == 0 && i + 1 < arr.length) { 
     increment(arr, i + 1); 
    } 
} 

public static boolean impossible(byte[] myBytes) throws UnsupportedEncodingException { 
    if (myBytes.length == 0) { 
     return false; 
    } 
    String string = new String(myBytes, "UTF-8"); 
    return string.length() == 0; 
} 
+0

Malheureusement, Java ne gère pas correctement la nomenclature UTF-8. Ne gère pas du tout, vraiment; juste le traite dans le cadre du contenu –