C#でUnicode文字の数値を取得するにはどうすればよいですか?
たとえば、タミル文字அ
( + 0B85 )が指定されている場合、出力は2949
(つまり、0x0B85
)になります。
一部の文字には複数のコードポイントが必要です。この例、UTF-16では、各コードユニットはまだ基本多言語プレーンにあります。
U+0072
U+0327
U+030C
)U+0072
U+0338
U+0327
U+0316
U+0317
U+0300
U+0301
U+0302
U+0308
U+0360
)より大きなポイントは、1つの「文字」が複数のUTF-16コードユニットを必要とする可能性があり、2つ以上のUTF-16コードユニットを必要とする可能性があり、3つ以上のUTF-16コードユニットを必要とする可能性があるということです。
より大きなポイントは、1つの「文字」が数十のユニコードコードポイントを必要とする可能性があるということです。 C#のUTF-16では、1 char
以上を意味します。 1つの文字には17 char
が必要です。
私の質問は、char
をUTF-16エンコーディング値に変換することについてでした。 17 char
の文字列全体が1つの「文字」のみを表す場合でも、各UTF-16単位を数値に変換する方法を知りたいです。
例えば.
String s = "அ";
int i = Unicode(s[0]);
基本的にはJavaと同じです。 char
として取得している場合は、暗黙的にint
に変換できます。
char c = '\u0b85';
// Implicit conversion: char is basically a 16-bit unsigned integer
int x = c;
Console.WriteLine(x); // Prints 2949
文字列の一部として取得する場合は、最初にその1文字を取得してください。
string text = GetText();
int x = text[2]; // Or whatever...
基本的な多言語プレーンにない文字は、2つのUTF-16コードユニットとして表されることに注意してください。 is完全なUnicodeコードポイントを見つけるための.NETのサポートがありますが、simpleではありません。
((int)'அ').ToString()
文字がchar
である場合は、それをint
にキャストできます。これは、文字の数値を表します。その後、他の整数と同じように、好きな方法でそれを印刷できます。
代わりに16進出力が必要な場合は、次を使用できます。
((int)'அ').ToString("X4")
X
は16進数用、4
は、4文字へのゼロパディング用です。
C#でUnicode文字の数値を取得するにはどうすればよいですか?
char
は、必ずしもUnicode全体であるとは限りません コードポイント 。 C#などのUTF-16でエンコードされた言語では、単一の「論理」文字を表すために実際には2つのchar
sが必要になる場合があります。そして、あなたの文字列の長さはあなたが期待するものではないかもしれません- String.LengthプロパティのMSDNドキュメント は言います:
"Lengthプロパティは、Unicode文字の数ではなく、このインスタンスのCharオブジェクトの数を返します。"
char
でエンコードされている場合、それはすでに数値です(基本的には符号なし16ビット整数)。いくつかの整数型にキャストしたい場合がありますが、これによってchar
に元々存在していた実際のビットは変更されません。Unicode文字が2char
sの場合、一方に2 ^ 16を掛けてもう一方に加算する必要があり、結果としてuint
の数値になります。
char c1 = ...;
char c2 = ...;
uint c =((uint)c1 << 16)| c2;
C#でUnicode文字の10進値を取得するにはどうすればよいですか?
「10進数」とは、通常、人間が10進数として解釈する文字のみを含む文字列を意味します。
Unicode文字を1つのchar
だけで表すことができる場合は、次の方法で10進文字列に変換できます。
char c = 'அ';
string s =((ushort)c).ToString();
Unicode文字に2つのchars
がある場合は、上記のようにそれらをuint
に変換してから、uint.ToString
を呼び出します。
---編集---
AFAIK発音区別符号は、「ベース」文字と一緒に視覚的にレンダリングされるにもかかわらず、別個の「文字」(および別個のコードポイント)と見なされます。単独で取得されたこれらのコードポイントのそれぞれは、依然として最大2つのUTF-16コードユニットです。
ところで、あなたが話していることの正しい名前は「文字」ではなく、 「結合文字」 だと思います。そうです、単一のcombining文字は、複数のコードポイント、したがって2つ以上のコードユニットを持つことができます。結合文字などの10進表現が必要な場合は、おそらくBigInteger
を使用して最も簡単に行うことができます。
string c = "\x0072\x0338\x0327\x0316\x0317\x0300\x0301\x0302\x0308\x0360";
string s = (new BigInteger(Encoding.Unicode.GetBytes(c))).ToString();
必要なコード単位「数字」の重要度の順序によっては、c
を逆にすることができます。
char c = 'அ';
short code = (short)c;
ushort code2 = (ushort)c;
これは、平面1、補足多言語面(SMP)の使用例です。
string single_character = "\U00013000"; //first Egyptian ancient hieroglyph in hex
//it is encoded as 4 bytes (instead of 2)
//get the Unicode index using UTF32 (4 bytes fixed encoding)
Encoding enc = new UTF32Encoding(false, true, true);
byte[] b = enc.GetBytes(single_character);
Int32 code = BitConverter.ToInt32(b, 0); //in decimal