J'ai une chaîne de caractères avec un caractère "ñ" et j'ai quelques problèmes avec elle. J'ai besoin d'encoder cette chaîne en encodage UTF-8. J'ai essayé de cette manière, mais cela ne fonctionne pas :
byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");
Comment puis-je encoder cette chaîne en utf-8 ?
2 votes
Ce que vous essayez de faire exactement n'est pas clair. Est-ce que maChaîne contient correctement le caractère ñ et vous avez des problèmes pour la convertir en tableau d'octets (dans ce cas, voir les réponses de Peter et Amir), ou est-ce que maChaîne est corrompue et vous essayez de la réparer (dans ce cas, voir les réponses de Joachim et moi) ?
0 votes
Je dois envoyer myString à un serveur avec un encodage utf-8 et je dois convertir le caractère "ñ" en encodage utf-8.
1 votes
Si le serveur attend l'UTF-8, vous devez lui envoyer des octets, pas une chaîne. Donc, conformément à la réponse de Peter, spécifiez l'encodage dans la première ligne et laissez tomber la deuxième ligne.
0 votes
@Michael : Je suis d'accord que l'intention réelle n'est pas claire ici. Il semble qu'il y ait beaucoup de questions où les gens essaient de faire des conversions explicites entre les chaînes de caractères et les octets plutôt que de laisser la fonction
{In,Out}putStream{Read,Writ}ers
le faire pour eux. Je me demande pourquoi ?0 votes
@tchrist : je pense que ces questions sont posées par des personnes dont l'expérience préalable est celle de langages comme C ou PHP, où une chaîne est fondamentalement la même chose qu'un tableau d'octets et où il faut suivre son encodage séparément (et où la conversion d'une chaîne d'un encodage à un autre a un sens).
1 votes
Merci, je suppose que ça a du sens. Mais cela rend aussi les choses plus difficiles qu'elles ne doivent l'être, n'est-ce pas ? Je n'aime pas beaucoup les langages qui fonctionnent de cette façon, et j'essaie donc d'éviter de travailler avec eux. Je pense que le modèle Java de chaînes de caractères au lieu d'octets rend les choses beaucoup plus faciles. Perl et Python partagent également le modèle "tout est constitué de chaînes Unicode". Oui, dans les trois modèles, il est toujours possible d'accéder aux octets si l'on s'y emploie, mais en pratique, il semble rare que l'on en ait vraiment besoin : c'est un niveau assez bas. De plus, c'est un peu comme brosser un chat dans le mauvais sens, si vous voyez ce que je veux dire :)
0 votes
@tchrist : Je suis tout à fait d'accord pour dire qu'une forte abstraction des chaînes de caractères est une très bonne chose. Mais C date d'une époque bien antérieure à l'existence d'Unicode, où il n'y avait pas d'encodage unique pouvant représenter tous les caractères, et où cualquier Ce type d'abstraction par rapport aux octets purs aurait été une pénalité de performance intolérable. Les programmeurs Java ont la chance d'avoir adapté l'Unicode relativement bien dès le début. Perl et Python sont plus anciens et ont dû adapter la prise en charge d'Unicode, ce qui la rend beaucoup moins propre (dualité str/unicode explicite en Python, drapeau UTF-8 implicite désagréable en Perl).
0 votes
@Michael : La dualité Python est assez ennuyeuse ; j'oublie toujours
/u
en Python ; même problème avec PHP. Avec Perl 5.14, maintenant en Tests RC1 vous pouvez enfin obtenir toutes les chaînes de caractères Unicode . Les regex en Perl sont toujours beaucoup plus adaptés à Unicode que ceux de Java, mais j'ai travaillé avec l'option Les gens de JDK7 pour corriger cela .0 votes
Duplicata possible de Comment convertir des chaînes de caractères en tableaux d'octets UTF8 en Java ?