web-dev-qa-db-fra.com

Comment puis-je obtenir un code de caractère Unicode?

Disons que j'ai ceci:

char registered = '®';

ou une umlaut ou tout autre caractère unicode. Comment pourrais-je obtenir son code?

60
Geo

Il suffit de le convertir en int:

char registered = '®';
int code = (int) registered;

En fait, il y a une conversion implicite de char à int, vous n'avez donc pas à le spécifier explicitement comme je l'ai fait ci-dessus, mais je le ferais dans ce cas pour que ce que vous essayez de faire soit évident.

Cela donnera l'unité de code UTF-16 - qui est identique au point de code Unicode pour tout caractère défini dans le plan multilingue de base. (Et seuls les caractères BMP peuvent être représentés sous la forme de valeurs char en Java.) Comme le dit la réponse d'Andrzej Doyle, si vous voulez que le point de code Unicode soit composé d'une chaîne arbitraire, utilisez Character.codePointAt().

Une fois que vous avez l'unité de code UTF-16 ou les points de code Unicode, mais dont il s'agit de nombres entiers, vous pouvez choisir ce que vous voulez en faire. Si vous voulez une représentation sous forme de chaîne, vous devez décider exactement de quel genre de représentation vous voulez. (Par exemple, si vous savez que la valeur sera toujours dans le BMP, vous voudrez peut-être une représentation hexadécimale fixe à 4 chiffres précédée de U+, par exemple "U+0020" pour l'espace.) Cela dépasse le cadre de cette question, car nous ne le faisons pas. savoir quelles sont les exigences.

100
Jon Skeet

Une méthode plus complète, bien que plus détaillée, consisterait à utiliser la méthode Character.codePointAt . Cela gérera les caractères de «substitution élevée», qui ne peuvent pas être représentés par un seul entier compris dans la plage que char peut représenter.

Dans l'exemple que vous avez donné, cela n'est pas strictement nécessaire - si le caractère (Unicode) peut être contenu dans une seule variable (Java) char (telle que la variable locale registered), il doit être compris dans la plage de \u0000 à \uffff 'pas besoin de s'inquiéter des paires de substitution. Mais si vous recherchez des points de code potentiellement plus élevés, à partir d'un tableau String/char, il est judicieux d'appeler cette méthode afin de couvrir les cas Edge.

Par exemple, au lieu de

String input = ...;
char fifthChar = input.charAt(4);
int codePoint = (int)fifthChar;

utilisation

String input = ...;
int codePoint = Character.codePointAt(input, 4);

Non seulement cela représente un peu moins de code dans ce cas, mais cela gérera la détection des paires de substitution pour vous.

33
Andrzej Doyle

En Java, techn est techniquement un "entier de 16 bits", vous pouvez donc le transtyper en int et vous obtiendrez le code . De Oracle :

Le type de données char est un seul caractère Unicode 16 bits. Il a un valeur minimale de '\ u0000' (ou 0) et une valeur maximale de '\ uffff' (ou 65 535 inclus).

Ainsi, vous pouvez simplement le lancer en int.

char registered = '®';
System.out.println(String.format("This is an int-code: %d", (int) registered));
System.out.println(String.format("And this is an hexa code: %x", (int) registered));
7
Felype

Pour moi, seul "Integer.toHexString (registered)" a fonctionné comme je le voulais:

char registered = '®';
System.out.println("Answer:"+Integer.toHexString(registered));

Cette réponse ne vous donnera que des représentations sous forme de chaînes, ce qui est habituellement présenté dans les tableaux. La réponse de Jon Skeet explique plus.

0
Darius Miliauskas

cher ami, Jon Skeet a dit que vous pouvez trouver le code décimal de caractère mais ce n’est pas un code hexadécimal tel qu’il devrait être mentionné dans unicode;.

il existe un outil open source à http://unicode.codeplex.com qui fournit des informations complètes sur un caractère ou une phrase.

il est donc préférable de créer un analyseur qui donne un caractère en tant que paramètre et renvoie ahexCode sous forme de chaîne

public static String GetHexCode(char character)
    {
        return String.format("{0:X4}", GetDecimal(character));
    }//end

espérons que cela aide

0
Nasser Hadjloo

Il existe une bibliothèque open source MgntUtils qui possède une classe d’utilitaire StringUnicodeEncoderDecoder. Cette classe fournit des méthodes statiques qui convertissent n'importe quelle chaîne en séquence Unicode et inversement. Très simple et utile. Pour convertir String, il suffit de:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(myString);

Par exemple, une chaîne "Hello World" sera convertie en

"\ u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

Cela fonctionne avec n'importe quelle langue. Voici le lien vers l'article qui explique toutes les explications sur la bibliothèque: MgntUtils . Recherchez le sous-titre "Convertisseur de chaînes Unicode". L'article vous donne un lien vers Maven Central où vous pouvez obtenir des artefacts et un github où vous pouvez obtenir le projet lui-même. La bibliothèque est fournie avec un code source javadoc et bien écrit.

0
Michael Gantman