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

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

например, если тамильский символ (U+0B85) учитывая, выход должен быть!--2--> (т. е. 0x0B85)

см. также

  • C++:как получить десятичное значение символа юникода в c++
  • Java:как я могу получить код символа Юникода?

Multi кодовая точка персонажи

некоторые символы требуют нескольких кодовых точек. В этом примере 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.

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

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

например

String s = "அ";

int i = Unicode(s[0]);

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

4 ответов


это в основном то же самое, что и 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. Там is поддержка в .NET для поиска полной кодовой точки Unicode, но это не простой.


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

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

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

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

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


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

A char Не обязательно весь Unicode код. В кодированных языках UTF-16, таких как C#, вам может понадобиться 2 chars для представления одного "логического" символа. И ваша длина строки migh не то, что вы ожидаете -MSDN documnetation для строки.Свойство Длины говорит:

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

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

    char c1 = ...;
    голец С2 = ...;
    uint c = ((uint) c1

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

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

  • если вы можете представить свой символ Юникода только одним 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.


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