Encoding.UTF7.GetBytes不会反转Encoding.UTF7.GetString()

时间:2014-11-10 12:37:29

标签: c# encoding bytearray utf-7

我想我错过了一些基本的东西,但我真的对此感到困惑,并且搜索未能找到任何东西。

我有以下......

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 个答案:

答案 0 :(得分:2)

您所看到的是以UTF-7编码相同文本的两种不同方式。

您的原始文字是:

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

bytes2的ASCII版本是

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

换句话说,它将除A-Z,a-z,0-9之外的所有内容编码为+A...-。这是不必要的,但我怀疑它是有效的。

来自UTF-7 wikipedia entry

  

某些字符可以直接表示为单个ASCII字节。第一组被称为"直接字符"并包含62个字母数字字符和9个符号:' ( ) , - . / : ?。直接字符在字面上是安全的。另一个主要组称为"可选的直接字符",包含除+〜+和空格之外的所有其他可打印字符,范围为​​U + 0020-U + 007E。使用可选的直接字符可以减小尺寸并增强人类的可读性,但也会增加设计糟糕的邮件网关等破坏的可能性,并且在头字段的编码字中使用时可能需要额外的转义。

答案 1 :(得分:2)

  

UTF-7(7位Unicode转换格式)是一种可变长度字符编码,用于使用ASCII字符流表示Unicode文本。 (C)维基百科

您的字节数组包含UTF7的错误序列。例如,数字" 163"不能用7位编码。

答案 2 :(得分:0)

这不是UTF7,我在得出结论时首先犯了错误。谢谢所有建议的人。

我曾与那些为编写应用程序主要部分的高级语言工作的人工作过(并且恰好在我们的建筑物中)。

他无法告诉我在输入的字符串和varbinary之间使用了什么编码,但是能够告诉我有办法强制使用unicode。由于这是两个应用程序中的新选项,我知道没有生成数据以旧方式编写,因此将更新双方以使用unicode编码进行此过程。到目前为止,这一切似乎都在起作用。