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

Kai*_*Kid 1 c# encoding utf-8 utf-7

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

我正在使用 C# 的 File.ReadAllText(string path, Encoding encoding) 稍后读取它。由于无关的原因,我们必须使用 UTF-7。

我们的行看起来像这样:

var content = File.ReadAllText(fileName, Encoding.UTF7);
Run Code Online (Sandbox Code Playgroud)

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

{ "commandValue": "testvalue + otherValue" }
Run Code Online (Sandbox Code Playgroud)

变成

{ "commandValue": "testvalue  otherValue" }
Run Code Online (Sandbox Code Playgroud)

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

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

为了测试,我试着用

var content = File.ReadAllText(fileName, Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)

它工作正常。字符没有消失。

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

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

wab*_*lab 5

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

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