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 для этого процесса. Кажется, все работает до сих пор.