Преобразование символа юникода в одно шестнадцатеричное значение в С#

58
7

Я получаю символ из записи emf, используя Encoding.Unicode.GetString, и результирующая строка содержит только один символ, но имеет два байта. Я не имею ни малейшего представления о схеме кодирования и наборе символов с несколькими байтами. Я хочу преобразовать этот символ в эквивалентное одно шестнадцатеричное значение. Можете ли вы помочь мне в этом отношении.

спросил(а) 2010-07-03T09:21:00+04:00 10 лет, 3 месяца назад
1
Решение
70

Не понятно, что вы имеете в виду. A char в С# - это 16-разрядное значение без знака. Если у вас есть источник двоичных данных, и вы хотите получить символы Unicode, вы должны использовать Encoding для декодирования двоичных данных в строку, доступ к которой можно получить как последовательность значений char.


Вы можете преобразовать char в шестнадцатеричную строку, сначала преобразуя его в целое число, а затем используя спецификатор формата X, например:


char = '\u0123';
string hex = ((int)c).ToString("X4"); // Now hex = "0123"

Теперь это оставляет еще одну проблему: суррогатные пары. Значения, которые не находятся в базовой многоязычной плоскости (U + 0000 до U + FFFF), представлены двумя кодовыми единицами UTF-16 - высоким суррогатом и низким суррогатом. Вы можете использовать методы char.IsSurrogate* для проверки суррогатных пар... хотя это сложнее (насколько я вижу), чтобы затем преобразовать суррогатную пару в значение UCS-4. Если вам повезет, вам не нужно будет справляться с этим... Если вы счастливы преобразовать свои двоичные данные в последовательность блоков кода UTF-16 вместо строгих значений UCS-4, вам не нужно беспокоиться.

EDIT: Учитывая ваши комментарии, все еще не совсем понятно, с чего вы должны начать. Вы говорите, что у вас есть два байта... они разделены или в массиве байтов? Что они представляют? Текст в определенной кодировке, предположительно... но какая кодировка? Как только вы знаете кодировку, вы можете легко преобразовать массив байтов в строку:


byte[] bytes = ...;
// For example, if your binary data is UTF-8
string text = Encoding.UTF8.GetString(bytes);
char firstChar = text[0];
string hex = ((int)firstChar).ToString("X4");

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

ответил(а) 2010-07-03T09:26:00+04:00 10 лет, 3 месяца назад
70

Попробуйте следующее:


System.Text.Encoding.Unicode.GetBytes(theChar.ToString())
.Aggregate("", (agg, val) => agg + val.ToString("X2"));

Однако, поскольку вы не указываете точно, что такое кодировка, в которой находится символ, это может потерпеть неудачу. Если вы хотите, чтобы вывод был строкой шестнадцатеричных символов или байтов, вы не делаете этого очень ясно. Я предполагаю, что первый, так как я думаю, вы хотите сгенерировать HTML. Сообщите мне, если это неправильно.

ответил(а) 2010-07-03T09:24:00+04:00 10 лет, 3 месяца назад
42

Получите текст в StringInfo:


http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx


http://msdn.microsoft.com/en-us/library/8k5611at.aspx


.NET Framework поддерживает текстовые элементы. Текстовый элемент - это единица текста, которая отображается как один символ, называемый графем. Текстовым элементом может быть базовый символ, суррогатная пара или комбинированная последовательность символов. Класс StringInfo предоставляет методы, которые позволяют вашему приложению разбивать строку на ее текстовые элементы и выполнять итерацию через текстовые элементы. Пример использования класса StringInfo см. В разделе Индексирование строк.


ответил(а) 2010-07-03T09:26:00+04:00 10 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема