web-dev-qa-db-ja.com

C#でUnicode文字の10進値を取得するにはどうすればよいですか?

C#でUnicode文字の数値を取得するにはどうすればよいですか?

たとえば、タミル文字+ 0B85 )が指定されている場合、出力は2949(つまり、0x0B85)になります。

も参照してください

マルチコードポイント文字

一部の文字には複数のコードポイントが必要です。この例、UTF-16では、各コードユニットはまだ基本多言語プレーンにあります。

  • enter image description here (つまり、U+0072U+0327U+030C
  • enter image description here (つまり、U+0072U+0338U+0327U+0316U+0317U+0300U+0301U+0302U+0308U+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]);

ここで、Unicodeは、入力式の最初の文字について、Unicode標準で定義されている整数値を返します。

13
Ian Boyd

基本的には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ではありません。

20
Jon Skeet
((int)'அ').ToString()

文字がcharである場合は、それをintにキャストできます。これは、文字の数値を表します。その後、他の整数と同じように、好きな方法でそれを印刷できます。

代わりに16進出力が必要な場合は、次を使用できます。

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

Xは16進数用、4は、4文字へのゼロパディング用です。

7
svick

C#でUnicode文字の数値を取得するにはどうすればよいですか?

charは、必ずしもUnicode全体であるとは限りません コードポイント 。 C#などのUTF-16でエンコードされた言語では、単一の「論理」文字を表すために実際には2つのcharsが必要になる場合があります。そして、あなたの文字列の長さはあなたが期待するものではないかもしれません- String.LengthプロパティのMSDNドキュメント は言います:

"Lengthプロパティは、Unicode文字の数ではなく、このインスタンスのCharオブジェクトの数を返します。"

  • したがって、Unicode文字が1つのcharでエンコードされている場合、それはすでに数値です(基本的には符号なし16ビット整数)。いくつかの整数型にキャストしたい場合がありますが、これによってcharに元々存在していた実際のビットは変更されません。
  • Unicode文字が2charsの場合、一方に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を逆にすることができます。

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

これは、平面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
0
Anton Andreev