Как получить десятичное значение символа юникода в C#?
как получить числовое значение символа Unicode в C#?
например, если тамильский символ அ
(U+0B85) учитывая, выход должен быть!--2--> (т. е. 0x0B85
)
см. также
- C++:как получить десятичное значение символа юникода в c++
- Java:как я могу получить код символа Юникода?
Multi кодовая точка персонажи
некоторые символы требуют нескольких кодовых точек. В этом примере 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.
большая точка заключается в том, что один "символ" может потребовать десятки кодовых точек 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 char
s для представления одного "логического" символа. И ваша длина строки migh не то, что вы ожидаете -MSDN documnetation для строки.Свойство Длины говорит:
" свойство Length возвращает количество объектов Char в этом экземпляре, а не количество символов Юникода."
- Итак, если ваш символ Юникода закодирован только в одном
char
, он уже числовой (по существу, беззнаковое 16-разрядное целое число). Вы можете захотеть cast это для некоторых целочисленных типов, но это не изменит фактического биты, которые изначально присутствовали вchar
. -
если ваш символ Юникода равен 2
char
s, вам нужно будет умножить один по 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
.