Pourquoi String.getBytes () de Java utilise-t-il "ISO-8859-1"
à partir de java.lang.StringCoding :
String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;
C'est ce qui est utilisé à partir de Java.lang.getBytes() , linux jdk 7
J'ai toujours été sous l'impression que l'UTF-8 est le jeu de caractères par défaut ?
Grâce
source d'informationauteur Amnon
Vous devez vous connecter pour publier un commentaire.
C'est un peu compliqué ...
Java essaie d'utiliser le codage de caractères par défaut pour revenir octets à l'aide de Cordes.getBytes().
.... Ici est la partie la plus délicate (ce qui est probablement jamais venu dans le jeu) ....
Si le système ne peut pas décoder ou encoder les chaînes en utilisant le jeu de caractères par défaut (UTF-8 ou un autre), alors il y aura une solution de repli à la norme ISO-8859-1. Si les secours ne fonctionne pas ... le système échoue!
.... Vraiment ... (gasp!) ... Pourrait-il en panne si mon charset spécifié ne peut pas être utilisé, et UTF-8 ou ISO-8859-1 sont également inutilisable?
Oui. La Java de la source de commentaires de l'état dans le StringCoding.coder(...) méthode:
... et puis il est des appels Système.exit(1)
Alors, pourquoi est-il intentionnel de secours à la norme ISO-8859-1 dans la méthode getBytes ()?
Il est possible, quoique peu probable, que les utilisateurs de la JVM ne peut pas en charge le décodage et l'encodage en UTF-8 ou le jeu de caractères spécifié sur la JVM de démarrage.
Alors, est le jeu de caractères par défaut est utilisé correctement dans la Chaîne de classe au cours de getBytes()?
Pas. Cependant, la question est ...
N'Chaîne.getBytes() livrer ce qu'il promet?
Le contrat tel que défini dans la Javadoc est correct.
La bonne nouvelle et meilleure façon de faire les choses)
Il est toujours conseillé de spécifier explicitement "ISO-8859-1" ou "US-ASCII" ou "UTF-8" ou quel que soit le caractère que vous voulez lors de la conversion d'octets dans les Chaînes de vice-versa, à moins que -- vous avez déjà obtenu le jeu de caractères par défaut et composé à 100% sûr que c'est la personne qu'il vous faut.
Utiliser cette méthode plutôt:
Pour trouver la valeur par défaut pour votre système, il suffit d'utiliser:
Espère que ça aide.
Le sans paramètre
String.getBytes()
méthode n'est pas utiliser ISO-8859-1 par défaut. Il utilisera la valeur par défaut de la plateforme d'encodage, si cela peut être déterminée. Si, toutefois, c'est soit manquant ou est inconnu de l'encodage, il revient à l'ISO-8859-1 comme un "défaut par défaut".Vous devriez très en voit rarement dans la pratique. Normalement, la plate-forme de codage par défaut sera détecté correctement.
Cependant, je te suggère fortement que vous spécifiez explicitement l'encodage des caractères à chaque fois que vous effectuez une encoder ou de décoder le fonctionnement. Même si vous voulez la plate-forme par défaut, spécifiez explicitement.
C'est pour la compatibilité de la raison.
Historiquement, toutes les méthodes de java sur Windows et Unix ne pas spécifier un jeu de caractères ont été à l'aide de la commune à l'époque, c'est-à
"ISO-8859-1"
.Comme mentionné par d'Isaac et de la javadoc, la valeur par défaut de la plateforme d'encodage est utilisé (voir Charset.java) :
Toujours spécifier le jeu de caractères lorsque vous faites de la chaîne de bytes ou octets de la chaîne de conversion.
Même lorsque, comme c'est le cas pour
String.getBytes()
vous trouvez encore un non dépréciées méthode ne prend pas le jeu de caractères (la plupart d'entre eux ont été dépréciées lorsque Java 1.1 est apparu). Tout comme avec l'endianness, le format de plate-forme n'est pas pertinent, ce qui est pertinent est la norme du format de stockage.Des précisions sur Skeet la réponse (qui est correcte)
Dans java.lang.Chaîne'source
getBytes()
appelsStringCoding.encode(char[] ca, int off, int len)
qui a sur sa première ligne :Ensuite (pas immédiatement, mais absolument) il appelle
static byte[] StringEncoder.encode(String charsetName, char[] ca, int off, int len)
où la ligne que vous avez cité vient, de passage comme le charsetName la csn - ainsi, dans cette ligne lecharsetName
sera être le jeu de caractères par défaut si celui-ci existe.