Encoding.UTF7.GetBytes не переворачивает Encoding.UTF7.GetString()

Я предполагаю, что упускаю что-то фундаментальное, но я действительно смущен этим, и поиск ничего не смог найти.

У меня есть следующее...

byte[] bytes1;
string string1;
byte[] bytes2;

Затем я делаю следующее

bytes1 = { 64, 55, 121, 54, 36, 72, 101, 118, 38, 40, 100, 114, 33, 110, 85, 94, 112, 80, 163, 36, 84, 103, 58, 126 };
string1 = System.Text.Encoding.UTF7.GetString(bytes1);
bytes2 = System.Text.Encoding.UTF7.GetBytes(string1);

Bytes2 заканчивается как 54 вместо 24 байтов, и они совершенно разные байты.

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

Теперь я в замешательстве. Я знаю, что если я не использую кодирование, тогда нельзя полагаться, что результат GetBytes из строки будет определенным набором байтов, но я использую кодирование и все еще получаю эту разницу.

Может ли кто-нибудь просветить меня до того, что мне не хватает?

РЕДАКТИРОВАТЬ: Вывод в том, что это не UTF7. Исходный байтовый массив записывается в varbinary в базе данных приложением, которое я программирую на языке высокого уровня. Я не контролирую, как исходные строки кодируются в varbinaries на этом языке. Я пытаюсь прочитать их и обработать их в небольшом дополнении C# для основного приложения, где я столкнулся с этой проблемой. Другие кодировки, которые я пробовал, также не дают правильных результатов.

3 ответа

Решение

UTF-7 (7-битный формат преобразования Unicode) - это кодировка символов переменной длины, которая была предложена для представления текста Unicode с использованием потока символов ASCII. (С) Википедия

Ваш байтовый массив содержит неверные последовательности для UTF7. Например, число "163" не может кодироваться 7 битами.

То, что вы видите, это два разных способа кодирования одного и того же текста в UTF-7.

Ваш оригинальный текст:

@7y6$Hev&(dr!nU^pP£$Tg:~

ASCII версия bytes2 является

+AEA-7y6+ACQ-Hev+ACY-(dr+ACE-nU+AF4-pP+AKMAJA-Tg:+AH4-

Другими словами, он кодирует все, кроме AZ, az, 0-9, как +A...-, Это не нужно, но я подозреваю, что это действительно.

Из записи в Википедии UTF-7:

Некоторые символы могут быть представлены непосредственно как одиночные байты ASCII. Первая группа называется "прямые символы" и содержит 62 буквенно-цифровых символа и 9 символов: ' ( ) , - . / : ?, Прямые символы безопасно включать буквально. Другая основная группа, известная как "необязательные прямые символы", содержит все другие печатные символы в диапазоне U+0020–U+007E, кроме ~ \ + и пробела. Использование необязательных прямых символов уменьшает размер и улучшает удобочитаемость, но также увеличивает вероятность взлома такими вещами, как плохо спроектированные почтовые шлюзы, и может потребовать дополнительного экранирования при использовании в закодированных словах для полей заголовка.

Это был не UTF7, и я в первую очередь допустил ошибки, придя к выводу, что это так. Спасибо всем, кто посоветовал это.

Я разговаривал с кем-то, кто работает на людей, которые пишут на языке высокого уровня, на котором запрограммирована основная часть приложения (и сегодня оно находится в нашем здании).

Он не мог сказать мне, какую кодировку он использовал между введенной строкой и varbinary, но смог сказать мне, что есть способ форсировать юникод. Поскольку это новая опция в обоих приложениях, я знаю, что никакие производственные данные не были записаны старым способом, поэтому обновлю обе стороны, чтобы использовать кодировку Unicode для этого процесса. Кажется, все работает до сих пор.

Другие вопросы по тегам