Как получить полные байты для символов Юникода в C #? - PullRequest
1 голос
/ 20 января 2012

Для символа больше > мне нужно получить полные байты, которые, как я понимаю, \u003E.Теперь C # только дает мне 3E.Есть ли способ получить всех персонажей?т.е. \u003E.

Я использую следующую строку кода.

Encoding.UTF8.GetBytes(">");   

В текстовом файле у меня есть следующее

\u003c

Что мне нужнопоиск вниз на уровне байтов

Спасибо!

Ответы [ 4 ]

2 голосов
/ 20 января 2012

Несколько лет назад я написал довольно длинную статью в http://www.hackcraft.net/xmlUnicode/#sect4, в которой более подробно говорится следующее, но:

> - это персонаж.Это чисто концептуальный предмет, который мы понимаем как имеющий одно или несколько значений, способов использования и способов его написания в зависимости от различных языковых и текстовых контекстов.Это абстрактное понятие, а не что-либо, что мы действительно можем использовать в компьютере.

U+003E (который в C # представлен как \u003E) - это кодовая точка.Это способ присвоения номера персонажу, но это все же довольно абстрактная вещь.Число 0x3E (62) по-прежнему является абстрактным понятием, а не тем, что мы можем использовать в компьютере.

00111110, 0000000000111110, 0011111000000000, 00000000000000000000000000111110 и 00111110000000000000000000000000 - все эторазличные способы, обычно используемые для представления той кодовой точки в фактических единицах и единицах, которые компьютеры могут представлять импульсами электрического заряда.

Между ними, как программисты, мы склонны рассматривать эти три как 0x3E, 0x003E или 0x000000003E, которые являются числами, сопоставленными с типами данных, которые мы фактически используем.Разница между 0000000000111110 и 0011111000000000 в этом заключается в том, что в них есть порядок байтов, и в основном мы не думаем об этом на данный момент, уже подумав (если необходимо), что «должны убедиться, что порядок байтов правильный», потому что это »если необходимо, это обычно происходит на уровне, когда никто вообще не думает о символах.

На самом деле, как программисты, мы склонны думать об этом в основном как о >, с которого мы начали.Абстракции великолепны.

Ваш код, который использует UTF-8, использует один из различных способов превращения символов в байты, тот, который превращает U + 003E в 0x3E.Есть и другие, хотя UTF-8 является наиболее полезным для большинства обменов.Следовательно, это один из правильных ответов на «полные байты для«> ».Байт 0x00, за которым следует 0x3E, и байт 0x3E, за которым следует 0x00, будут двумя другими правильными ответами, обе формы UTF-16 с различным порядком байтов.Последовательности байтов 0x00, 0x00, 0x00, 0x3E и 0x3E, 0x00, 0x00, 0x00 будут правильными. UTF-32.

Если у вас есть причина для того, чтобы захотеть конкретный из них, используйте соответствующую кодировку.Если вы сомневаетесь, используйте UTF-8, как вы это делали.

2 голосов
/ 20 января 2012

В UTF-8 (диапазон ASCII) char > кодируется в 1 байт.

Если вы хотите строку "003E", вы можете использовать:

  Encoding.Utf8.GetBytes(">")[0].ToString("X4");

и, возможно, добавьте "\ u" впереди.

Если вам нужен массив из 2 байтов, содержащий {0x00, 0x3E}, используйте

  Encoding.Unicode.GetBytes(">");
2 голосов
/ 20 января 2012

Какие байты составляют > отличается от кодирования к кодированию - в UTF8 это действительно только 0x3e, в Unicode это 0x00 0x3e, поэтому вам нужно

Encoding.XXXX.GetBytes(">");

с XXXX, являющимсякодировка на ваш выбор, например UTF8 или Unicode

2 голосов
/ 20 января 2012

Вы получите правильный ответ - 3E - это шестнадцатеричное представление U+003E.

Если вам нужны байты Юникода (то есть 2-байтовый массив), просто используйте следующую кодировку:

Encoding.Unicode.GetBytes(">");
...