Как получить числовое значение символа 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
.