Как я могу получить десятичное значение символа Unicode в C #? - PullRequest
13 голосов
/ 19 октября 2011

Как получить числовое значение символа Юникод в C #?

Например, если задан тамильский символ ( U + 0B85 ), значение должно быть 2949 (т.е. 0x0B85)

Смотри также

Несколько символов кодовой точки

Для некоторых символов требуется несколько кодов. В этом примере UTF-16 каждая кодовая единица все еще находится в базовой многоязычной плоскости:

  • enter image description here (т.е. U+0072 U+0327 U+030C)
  • enter image description here (т.е. 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.

Большая точка в том, что один «символ» может потребовать десятки кодовых точек юникода В UTF-16 на C # это означает более 1 char. Один символ может потребовать 17 char.

Мой вопрос был о преобразовании char в значение кодировки UTF-16. Даже если целая строка 17 char представляет только один «символ», я все же хочу знать, как преобразовать каждую единицу UTF-16 в числовое значение.

например.

String s = "அ";

int i = Unicode(s[0]);

Где Unicode возвращает целочисленное значение, как определено стандартом Unicode, для первого символа входного выражения.

Ответы [ 4 ]

20 голосов
/ 19 октября 2011

Это в основном то же самое, что и Java.Если у вас есть char, вы можете просто неявно преобразовать в int:

char c = '\u0b85';

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

Если вы получили его как часть строки, сначала получите этот единственный символ:

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

Обратите внимание, что символы не в базовой многоязычной плоскости будут представлены как две кодовые единицы UTF-16. имеет поддержку в .NET для поиска полной кодовой точки Unicode, но это не простой .

7 голосов
/ 19 октября 2011
((int)'அ').ToString()

Если у вас есть символ char, вы можете привести его к int, который будет представлять числовое значение символа. Затем вы можете распечатать это любым удобным вам способом, как и с любым другим целым числом.

Если вы хотите вместо шестнадцатеричного вывода, вы можете использовать:

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

X для шестнадцатеричного числа, 4 для заполнения нулями до четырех символов.

3 голосов
/ 19 октября 2011

Как получить числовое значение символа Unicode в C #?

A char не обязательно является целым Unicode кодовой точкой . В кодированных языках UTF-16, таких как C #, вам может потребоваться 2 char s для представления одного «логического» символа. И длина вашей строки может отличаться от ожидаемой - документация MSDN для свойства String.Length говорит:

"Свойство Length возвращает количество объектов Char в этом экземпляре, а не количество символов Unicode."

  • Итак, если ваш символ Unicode кодируется только одним char, он уже числовой (по сути, 16-разрядное целое число без знака). Возможно, вы захотите привести к некоторым целочисленным типам, но это не изменит фактические биты, которые изначально присутствовали в char.
  • Если ваш символ Unicode равен 2 char с, вам нужно умножить один на 2 ^ 16 и добавить его к другому, в результате чего получите uint числовое значение:

    char c1 = ...;
    char c2 = ...;
    uint c = ((uint) c1 << 16) | с2; </p>

Как получить десятичное значение символа Юникод в C #?

Когда вы говорите «десятичный», это обычно означает строку символов, содержащую только те символы, которые человек будет интерпретировать как десятичные цифры.

  • Если вы можете представить свой символ Unicode только одним char, вы можете преобразовать его в десятичную строку просто:

    char c = 'அ';
    строка s = ((ushort) c) .ToString ();

  • Если у вас есть 2 chars для вашего символа Unicode, преобразуйте их в uint, как описано выше, затем вызовите uint.ToString.

--- РЕДАКТИРОВАТЬ ---

Диакритические знаки AFAIK считаются отдельными «символами» (и отдельными кодовыми точками), несмотря на то, что визуально отображаются вместе с «базовым» символом. Каждая из этих кодовых точек, взятых отдельно, по-прежнему не более 2 кодовых единиц UTF-16.

Кстати, я думаю, что правильное название того, о чем вы говорите, - это не "символ", а "комбинирующий символ" . Так что да, один объединяющий символ может иметь более 1 кодовой точки и, следовательно, более 2 кодовых единиц. Если вам нужно десятичное представление, например объединяющий символ, вы, вероятно, можете сделать это проще всего с помощью BigInteger:

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

В зависимости от того, какой порядок значимости кодовых единиц «цифр» вы хотите, вы можете захотеть поменять c.

1 голос
/ 19 октября 2011
char c = 'அ';
short code = (short)c;
ushort code2 = (ushort)c;
...