Encoder Chaîne de caractères UTF-8
J'ai une Corde avec un " - " le personnage et j'ai quelques problèmes avec elle. J'ai besoin de coder cette Chaîne pour l'encodage UTF-8. J'ai essayé de cette manière, mais ça ne fonctionne pas:
byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");
Comment puis-je encoder la chaîne utf-8?
- Il est difficile de savoir exactement ce que vous essayez de faire. Ne myString correctement contenir le ñ caractère et vous avez des problèmes en la convertissant en un tableau d'octets (dans ce cas voir les réponses de Pierre et Amir), ou est myString endommagé et que vous essayez de résoudre (dans ce cas, voir les réponses de Joachim et moi)?
- J'ai besoin d'envoyer myString à un serveur avec l'encodage utf-8 et j'ai besoin de convertir les " - " le caractère de l'encodage utf-8.
- Ainsi, si le serveur s'attend à ce UTF-8, puis ce que vous devez l'envoyer sont octets, pas une Chaîne de caractères. De sorte que par la réponse de Pierre, spécifier l'encodage dans la première ligne et de la chute de la deuxième ligne.
- Je suis d'accord qu'il n'est pas clair quelle est la véritable intention est ici. Il semble y avoir beaucoup de questions où les gens essaient de conversions explicites entre les Cordes et les octets plutôt que de laisser le
{In,Out}putStream{Read,Writ}ers
le faire pour eux. Je me demande pourquoi? - ma conjecture est que ces questions sont posées par des personnes dont les expériences antérieures avec des langages comme C ou en PHP si une chaîne est essentiellement la même chose que d'un tableau d'octets et que vous avez à suivre son encodage séparément (et la conversion d'une chaîne à partir d'un encodage à un autre a un sens).
- Merci, je suppose que ça a du sens. Mais elle rend aussi plus difficile qu'il doit être, n'est-ce pas? Je ne suis pas très friand des langues de travail de cette façon, et donc, essayez d'éviter de travailler avec eux. Je pense que Java est le modèle de Chaînes de caractères au lieu d'octets rend les choses beaucoup plus facile. Perl et Python aussi partager le “tout est des chaînes Unicode” modèle. Oui, dans tous les trois, vous pouvez toujours obtenir à octets si vous travaillez à lui, mais dans la pratique, il semble rare que vous avez vraiment besoin d': c'est assez bas niveau. De Plus il se sent un peu comme se brosser les dents d'un chat dans la mauvaise direction, si vous savez ce que je veux dire. 🙂
- Je suis complètement d'accord qu'une forte chaîne de l'abstraction est une très bonne chose. Mais C est à partir d'un temps long avant Unicode existé, quand il n'y a pas de codage unique qui pourrait représenter tous les caractères, et quand toute sorte d'abstraction plus pure octets aurait été intolérable de la performance. Les programmeurs Java sont de la chance qu'il a adapté Unicode relativement bien depuis le début. Perl et Python sont plus âgés et avaient support de l'Unicode rénovés, ce qui le rend beaucoup moins propre (explicite str/unicode dualité en Python, méchant implicite UTF-8 drapeau en Perl.
- Le Python de la dualité est assez gênant; je suis toujours oublier
/u
en Python, même problème avec PHP. Avec Perl 5.14, maintenant dans RC1 test, vous pouvez enfin get toutes les chaînes Unicode. Perl regexes sont encore beaucoup plus d'Unicode de l'environnement que de Java, mais j'ai travaillé avec le JDK7 les gens à résoudre qu'. - double possible de Comment faire pour convertir des Chaînes et de l'UTF8 tableaux d'octets en Java
Vous devez vous connecter pour publier un commentaire.
String
objets en Java utiliser le codage UTF-16 qui ne peuvent pas être modifiés.La seule chose qui peut avoir un codage différent est un
byte[]
. Donc, si vous avez besoin des données UTF-8, alors vous avez besoin d'unbyte[]
. Si vous avez unString
qui contient des données inattendues, alors le problème est parfois plus tôt place que mal converties des données binaires à unString
(c'est à dire qu'il était mauvais encodage).byte[]
, il ne fait pas de sens pourString
(sauf si l'encodage est UTF-16, dans lequel cas il fait sens, mais il reste encore des informations inutiles).String objects in Java use the UTF-16 encoding that can't be modified.
Avez-vous une source officielle de cette citation?Comment sur l'utilisation de
myString.getBytes(Charsets.UTF_8)
, et d'octets -> String:new String(myByteArray, Charsets.UTF_8)
.StandardCharsets.UTF_8
. Disponible en Java 1.7+.Utilisation
byte[] ptext = String.getBytes("UTF-8");
au lieu degetBytes()
.getBytes()
utilise des soi-disant "encodage par défaut", qui peuvent ne pas être en UTF-8.Dans Java7 vous pouvez utiliser:
Cela a l'avantage sur
getBytes(String)
qu'il ne déclare pasthrows UnsupportedEncodingException
.Si vous utilisez une ancienne version de Java, vous pouvez déclarer le jeu de caractères constantes de vous-même:
Java Chaîne est en interne toujours encodé en UTF-16, mais vous devriez vraiment penser comme ça: un codage est un moyen de traduire entre les Cordes et les octets.
Donc si vous avez un problème d'encodage, par le temps que vous avez Chaîne, il est trop tard pour corriger. Vous avez besoin de fixer l'endroit où vous créez une Chaîne à partir d'un fichier, DB ou d'une connexion réseau.
Vous pouvez essayer de cette façon.
et, si vous voulez lire depuis un fichier texte avec "ISO-8859-1" codé:
Dans un moment où je suis allé par le biais de ce problème et réussi à le résoudre de la manière suivante
j'ai d'abord besoin d'importer
Ensuite, j'ai dû déclarer une constante à utiliser
UTF-8
etISO-8859-1
Puis j'ai pu l'utiliser de la manière suivante:
J'ai utiliser de code ci-dessous pour encoder les caractères spéciaux en spécifiant les encoder au format.
Cela a résolu mon problème