0

我想我错过了一些基本的东西,但我真的被这个弄糊涂了,搜索也没能找到我任何东西。

我有以下...

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# 插件中处理它们,这是我遇到这个问题的地方。我尝试过的其他编码也没有给出正确的结果。

4

3 回答 3

2

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

您的字节数组包含不正确的 UTF7 序列。例如,数字“163”不能按 7 位编码。

于 2014-11-10T13:49:46.187 回答
2

您所看到的是用 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 范围内的所有其他可打印字符,除了 ~\+ 和空格。使用可选的直接字符会减小大小并增强人类可读性,但也会增加被设计不良的邮件网关等破坏的机会,并且在用于标题字段的编码字时可能需要额外的转义。

于 2014-11-10T12:47:46.373 回答
0

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

我已经与为编写应用程序主要部分的高级语言的人工作的人交谈过(并且恰好在我们今天的建筑物中)。

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

于 2014-11-10T15:09:56.083 回答