2010-10-16 8 views
1

Si j'utilise des caractères ASCII 33-127, la méthode codePointAt donne la valeur décimale correcte, par exemple:Java String.codePointAt retourne une valeur inattendue

String s1 = new String("#"); 
int val = s1.codePointAt(0); 

Ce retour 35 qui est la valeur correcte.

Mais si je tente utiliser des caractères ASCII de 128 à 255 (ASCII étendu/ISO-8859-1), cette méthode donne une valeur erronée, par exemple:

String s1 = new String("ƒ") // Latin small letter f with hook 
int val = s1.codePointAt(0); 

Cela devrait retourner 159 selon this reference table, mais retourne à la place 409, pourquoi est-ce?

+2

Votre table de référence est très mauvaise. C'est ce qu'on appelle "Extended ASCII", ce qui n'a pas beaucoup de sens puisqu'il existe des myriades de jeux de caractères différents qui pourraient tous être appelés "Extended ASCII". Il devrait au moins indiquer de quel personnage il s'agit. –

+0

Regardez http://www.fileformat.info/info/unicode/char/192/index.htm pour toutes les informations sur ƒ. Vous y trouverez des informations sur les charsets et les pages de code qui prennent en charge ces caractères. –

+0

ƒ ne fait pas partie de ISO-8859-1 –

Répondre

4

Mais si j'essaie d'utiliser des caractères ASCII à partir 128 à 255

ASCII ne dispose pas de valeurs dans cette plage. Il utilise seulement 7 bits.

Les caractères Java sont UTF-16 (et rien d'autre!). Si vous voulez représenter l'ASCII en utilisant Java, vous devez utiliser un tableau d'octets. La méthode codePointAt renvoie le code de 32 bits. Les caractères de 16 bits ne peuvent pas contenir la totalité de la plage Unicode. Par conséquent, certains points de code doivent être répartis entre deux caractères (conformément au code encoding scheme for UTF-16). La méthode codePointAt permet de résoudre les points de code chars.

J'ai écrit un guide approximatif de l'encodage en Java here.

2

Les caractères Java ne sont pas codés en ISO-8859-1. Ils utilisent UTF-16 qui a les mêmes valeurs pour les caractères ASCII 7 bits (uniquement les valeurs de 0-127).

Pour obtenir la valeur correcte pour ISO-8859-1 vous devez convertir votre chaîne en un octet [] avec String.getBytes("ISO-8859-1"); et regarder dans le tableau d'octets.

Mise à jour

ISO-8859-1 est pas l'encodage extended ASCII, utilisez String.getBytes("Cp437"); pour obtenir les valeurs correctes.

+1

'ƒ' n'est pas représenté dans ISO-8859-1, donc le résultat de getBytes est indéfini. Sur certaines implémentations, il ne retournera que les octets pour '?'. –

+0

@Michael Konietzka bon à savoir, je n'ai pas vérifié l'encodage. – josefx

0

en Unicode

ƒ 0x0192 LATIN SMALL LETTER F WITH HOOK 
0

String.codePointAt renvoie l'Unicode-codet de cet index spécifié.

L'Unicode Codepoint de ƒ est 402, voir

http://www.decodeunicode.org/de/u+0192/properties

Alors

System.out.println("ƒ".codePointAt(0)); 

impriment 402 est correcte.

Si vous êtes intéressé par la représentation dans d'autres jeux de caractères, vous pouvez imprimer les octets representaion du caractère dans d'autres jeux de caractères via getBytes(String charsetName):

final String s = "ƒ"; 
    for (final String csName : Charset.availableCharsets().keySet()) { 
    try { 
    final Charset cs = Charset.forName(csName); 
    final CharsetEncoder encode = cs.newEncoder(); 
    if (encode.canEncode(s)) 
      { 
     System.out.println(csName + ": " + Arrays.toString(s.getBytes(csName))); 
      } 
     } catch (final UnsupportedOperationException uoe) { 
     } catch (final UnsupportedEncodingException e) { 
    } 
    } 
Questions connexes