Come ottengo il valore decimale di un carattere Unicode in C #?

Come ottengo il valore numerico di un carattere Unicode in C #?

Ad esempio se il carattere tamil ( U + 0B85 ) è dato, l’output dovrebbe essere 2949 (cioè 0x0B85 )

Guarda anche

  • C ++: come ottenere il valore decimale di un carattere unicode in c ++
  • Java: come posso ottenere il codice di un personaggio Unicode?

Caratteri multi punto di codice

Alcuni personaggi richiedono più punti di codice. In questo esempio, UTF-16, ogni unità di codice è ancora nel piano multilingue di base:

  • inserisci la descrizione dell'immagine qui (cioè U+0072 U+0327 U+030C )
  • inserisci la descrizione dell'immagine qui (cioè U+0072 U+0338 U+0327 U+0316 U+0317 U+0300 U+0301 U+0302 U+0308 U+0360 )

Il punto più grande è che un “personaggio” può richiedere più di 1 unità di codice UTF-16, può richiedere più di 2 unità di codice UTF-16, può richiedere più di 3 unità di codice UTF-16.

Il punto più grande è che un “carattere” può richiedere dozzine di punti di codice unicode. In UTF-16 in C # significa più di 1 char . Un personaggio può richiedere 17 char .

La mia domanda riguardava la conversione di char in un valore di codifica UTF-16. Anche se un’intera stringa di 17 char rappresenta solo un “carattere”, voglio comunque sapere come convertire ciascuna unità UTF-16 in un valore numerico.

per esempio

 String s = "அ"; int i = Unicode(s[0]); 

Dove Unicode restituisce il valore intero, come definito dallo standard Unicode, per il primo carattere dell’espressione di input.

È fondamentalmente lo stesso di Java. Se lo hai come char , puoi semplicemente convertire in int implicitamente:

 char c = '\u0b85'; // Implicit conversion: char is basically a 16-bit unsigned integer int x = c; Console.WriteLine(x); // Prints 2949 

Se lo hai preso come parte di una stringa, devi prima ottenere quel singolo carattere:

 string text = GetText(); int x = text[2]; // Or whatever... 

Si noti che i caratteri non presenti nel piano multilingue di base saranno rappresentati come due unità di codice UTF-16. È disponibile supporto in .NET per trovare il punto di codice Unicode completo, ma non è semplice .

 ((int)'அ').ToString() 

Se hai il carattere come char , puoi lanciarlo su un int , che rappresenterà il valore numerico del personaggio. Puoi quindi stamparlo nel modo che preferisci, proprio come con qualsiasi altro intero.

Se si desidera invece l’output esadecimale, è ansible utilizzare:

 ((int)'அ').ToString("X4") 

X è per esadecimale, 4 è per zero-padding a quattro caratteri.

Come ottengo il valore numerico di un carattere Unicode in C #?

Un char non è necessariamente l’intero punto di codice Unicode. Nei linguaggi con codifica UTF-16 come C #, potrebbe essere necessario 2 char per rappresentare un singolo carattere “logico”. E le lunghezze delle stringhe non sono quelle che ti aspetti: la documnetazione MSDN per la proprietà String.Length dice:

“La proprietà Length restituisce il numero di oggetti Char in questa istanza, non il numero di caratteri Unicode.”

  • Quindi, se il tuo carattere Unicode è codificato in un solo char , è già numerico (essenzialmente un intero a 16 bit senza segno). Potresti voler lanciarlo su alcuni dei tipi interi, ma questo non cambierà i bit reali che erano originariamente presenti nel char .
  • Se il tuo carattere Unicode è di 2 char , dovrai moltiplicare uno per 2 ^ 16 e aggiungerlo all’altro, ottenendo un valore numerico uint :

    char c1 = …;
    char c2 = …;
    uint c = ((uint) c1 << 16) | c2;

Come ottengo il valore decimale di un carattere Unicode in C #?

Quando si dice “decimale”, in genere si intende una stringa di caratteri contenente solo caratteri che un essere umano interpreterà come cifre decimali.

  • Se puoi rappresentare il tuo carattere Unicode con un solo char , puoi convertirlo in stringa decimale semplicemente:

    char c = ‘அ’;
    string s = ((ushort) c) .ToString ();

  • Se hai 2 chars per il tuo carattere Unicode, convertili in un uint come descritto sopra, quindi chiama uint.ToString .

— MODIFICARE —

I segni diacritici di AFAIK sono considerati “caratteri” separati (e punti di codice separati) nonostante siano rappresentati visivamente insieme al carattere di “base”. Ciascuno di questi punti di codice presi da solo è ancora al massimo 2 unità di codice UTF-16.

A proposito, penso che il nome giusto per ciò di cui stai parlando non sia “carattere” ma “combinazione di carattere” . Quindi sì, un singolo personaggio che combina può avere più di 1 punto di codice e quindi più di 2 unità di codice. Se vuoi una rappresentazione decimale come combinare un personaggio, puoi probabilmente farlo più facilmente tramite BigInteger :

 string c = "\x0072\x0338\x0327\x0316\x0317\x0300\x0301\x0302\x0308\x0360"; string s = (new BigInteger(Encoding.Unicode.GetBytes(c))).ToString(); 

A seconda di quale ordine di significato delle “cifre” dell’unità di codice desideri, è ansible invertire la c .

 char c = 'அ'; short code = (short)c; ushort code2 = (ushort)c;