JAVA: obtenir UTF-8 Hex valeurs à partir d'une chaîne de caractères?
Je voudrais être en mesure de convertir des raw d'une chaîne UTF-8 pour une chaîne Hexadécimale.
Dans l'exemple ci-dessous, j'ai créé un exemple de chaîne UTF-8 contenant de 2 lettres.
Alors je vais essayer d'obtenir les valeurs en Hexadécimal, mais il me donne des valeurs négatives.
Comment puis-je faire il me donner 05D0 et 05D1
String a = "\u05D0\u05D1";
byte[] xxx = a.getBytes("UTF-8");
for (byte x : xxx) {
System.out.println(Integer.toHexString(x));
}
Merci.
OriginalL'auteur thedp | 2012-03-14
Vous devez vous connecter pour publier un commentaire.
Ne pas convertir à un codage comme UTF-8 si vous souhaitez que le point de code. Utilisation Caractère.codePointAt.
Par exemple:
new String(bytes, "UTF-8")
et ensuite utiliserCharacter.codePointAt(...).toHexString()
pour obtenir la représentation hexadécimale.Peut-être que je suis absent quelque chose.
Character.codePointAt
n'ont pas detoHexString
méthode, il renvoie un entier. Pouvez-vous svp me donner des exemple complet? MerciOups, toHexString est une méthode statique.
System.out.println(Integer.toHexString(Character.codePointAt("\u05D0", 0)))
imprimé5d0
. Si vous voulez pad avec des zéros sur la gauche, essayezSystem.out.printf("%08x", Character.codePointAt("\u05D0", 0))
qui imprime000005d0
.Fonctionne comme un charme. Je vous remercie.
OriginalL'auteur ataylor
Valeurs négatives se produisent parce que la gamme de
byte
est de -128 à 127. Le code suivant va produire des valeurs positives:La principale différence est qu'il génère des
x & 0xFF
au lieu de simplementx
, cette opération convertitbyte
àint
, l'abandon de la signer.Cela se produit parce que les symboles de l'encodage sont représentés en UTF-8 par ces octets. Si vous souhaitez recevoir les octets que vous avez dit, vous devez utiliser l'UTF-16.
L'encodage UTF-8 ne fait pas ce que vous pensez que ce n'est que je soupçonne. Chaque valeur est codé sur plusieurs octets. Voir en.wikipedia.org/wiki/UTF-8#Description pour plus de détails.
Exactement. D7 90 en binaire est 11010111 10010000. Ici, 110 au début du premier octet est simplement un indicateur qu'il y aura de l'octet suivant. 10 au début de la deuxième octet dit que ce n'est pas le premier octet. Si nous les supprimons, nous avons le nombre suivant 10111 010000, ce qui est exactement 5D0 dans l'hex. C'est la façon dont le processus de décodage fonctionne en UTF-8.
Merci pour l'explication de ce sujet pour moi.
OriginalL'auteur Malcolm