File.ReadAllText与UTF-7忽略+字符

时间:2017-08-01 19:33:50

标签: c# encoding utf-8 utf-7

我在磁盘上有一个由程序编写的文件,其中一些数据用Json编码。

我正在使用C#的File.ReadAllText(字符串路径,编码编码)来稍后读取它。出于无关的原因,我们必须使用UTF-7。

我们的行看起来像这样:

var content = File.ReadAllText(fileName, Encoding.UTF7);

它工作正常,写作然后阅读,基本上我们需要的一切。唯一的例外是加号(+)。如果我们的文件中有一个+号,则此代码返回整个字符串,忽略所有这些。所以

{ "commandValue": "testvalue + otherValue" }

变成

{ "commandValue": "testvalue  otherValue" }

我检查了文件字节,+符号确实是字符0x2B,这是UTF-7中的正确字符(在UTF-8中也是相同的字符,不确定是否重要)。

我无法弄清楚为什么它们在阅读时会消失。

为了测试,我尝试用

阅读
var content = File.ReadAllText(fileName, Encoding.UTF8);

它工作正常。这些人并没有消失。

我可能做错了什么,怎样才能使File.ReadAllText(fileName,Encoding.UTF7)不忽略这些字符?

到目前为止,我还没有找到另一个有此问题的字符,但我显然没有测试所有这些字符。

1 个答案:

答案 0 :(得分:4)

该文件未使用UTF7编写。 ' +'是UTF7编码方案中的一个特殊字符,用于表示"修改后的base64"序列。因此,当文件被读取为UTF7时,解码器会看到' +',需要修改的base64序列(但找不到),然后像往常一样继续解码文件。 ' +'结果会从输出中被抑制。

要解决您所看到的问题,您可能会尝试将文件读取为UTF8,或者您可以更新编写该文件的代码以确保它使用UTF7编码。