2017-08-01 24 views
-1

我在程序中写入的磁盘上有一个文件,其中一些数据是用Json编码的。使用UTF-7忽略+字符的File.ReadAllText

我使用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); 

读它,它工作得很好。 chars没有消失。

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

截至目前,我还没有发现另一个字符有这个问题,但我显然没有测试所有这些。

+0

你确定这个文件已经保存在utf上而不是unicode中吗? – Gusman

+0

'+'是UTF7中用来表示转义序列的特殊字符。对@古斯曼来说,字符串可能不是使用UTF7编码编写的。当你以UTF7读取它时,该'+'被视为转义序列的开始,但是没有遇到有效的序列,所以UTF7编码器只是'吃''+'。如果在文件中的每个加号之后加上' - ',UTF7解码将正常工作(即所有的“+”变成“+ - ”)......至少对于这些加号来说。但主要问题是,字符串未使用UTF7编码器写入文件。 – wablab

+0

@wablab我知道,这就是为什么我问... – Gusman

回答

2

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

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

+0

我建议在你的评论中加入关于“+ - ”序列的一点。考虑到每个从事写入和读取部分工作的人都正在度假,我无法弄清楚他们为什么选择这些编码进行读写,并且在不知道影响的全部范围的情况下不会改变它。暂时,我已经使用“+ - ”方法作为此用户的占位符,直到我可以获得所需的输入。 –