En Java, j'ai une chaîne et je veux l'encoder comme un tableau d'octets (en UTF8, ou un autre encodage). Alternativement, j'ai un tableau d'octets (dans certains encodages connus) et je veux le convertir en une chaîne Java. Comment faire ces conversions?
239
Voici une solution qui évite d'effectuer la recherche Charset pour chaque conversion:
la source
StandardCharsets.UTF_8
pour un moyen constant d'accéder au jeu de caractères UTF-8.la source
Vous pouvez convertir directement via le constructeur String (byte [], String) et la méthode getBytes (String). Java expose les jeux de caractères disponibles via la classe Charset . La documentation JDK répertorie les encodages pris en charge .
Dans 90% des cas, ces conversions sont effectuées sur des flux, vous devez donc utiliser les classes Reader / Writer . Vous ne décoderiez pas de manière incrémentielle en utilisant les méthodes String sur des flux d'octets arbitraires - vous vous laisseriez ouvert aux bogues impliquant des caractères multi-octets.
la source
UTF-8
, quelle est la préoccupation concernant les caractères multi-octets?Mon implémentation tomcat7 accepte les chaînes comme ISO-8859-1; malgré le type de contenu de la requête HTTP. La solution suivante a fonctionné pour moi lorsque j'essayais d'interpréter correctement des caractères comme «é».
Lorsque vous tentez d'interpréter la chaîne comme US-ASCII, les informations sur les octets n'étaient pas correctement interprétées.
la source
StandardCharSets.UTF_8
etStandardCharSets.ISO_8859_1
.Comme alternative, StringUtils d'Apache Commons peut être utilisé.
ou
Si vous avez un jeu de caractères non standard, vous pouvez utiliser getBytesUnchecked () ou newString () en conséquence.
la source
Pour décoder une série d'octets en un message de chaîne normale, j'ai finalement réussi à le faire fonctionner avec le codage UTF-8 avec ce code:
la source
Si vous utilisez ASCII 7 bits ou ISO-8859-1 (un format incroyablement commun), vous n'avez pas du tout besoin de créer un nouveau java.lang.String . Il est beaucoup plus performant de simplement convertir l'octet en caractère:
Exemple de travail complet:
Si vous n'utilisez pas de caractères étendus comme Ä, Æ, Å, Ç, Ï, Ê et que vous pouvez être sûr que les seules valeurs transmises sont des 128 premiers caractères Unicode, alors ce code fonctionnera également pour UTF-8 et ASCII étendu. (comme cp-1252).
la source
Je ne peux pas commenter mais je ne veux pas commencer un nouveau fil. Mais cela ne fonctionne pas. Un simple aller-retour:
J'aurais besoin de b [] le même tableau avant et après l'encodage, ce qui n'est pas le cas (cela renvoie à la première réponse).
la source
la source
la source
la source
terriblement en retard mais je viens de rencontrer ce problème et voici ma solution:
la source