【发布时间】:2017-08-01 19:33:50
【问题描述】:
我在磁盘上有一个文件已经被程序写入,其中一些数据用 Json 编码。
我正在使用 C# 的 File.ReadAllText(string path, Encoding encoding) 稍后读取它。由于不相关的原因,我们必须使用 UTF-7。
我们的线条看起来像这样:
var content = File.ReadAllText(fileName, Encoding.UTF7);
它工作正常,先写然后读,基本上我们需要的一切。唯一的例外是加号 (+)。如果我们的文件中有 + 号,则此代码将返回整个字符串,而忽略所有这些。所以
{ "commandValue": "testvalue + otherValue" }
变成
{ "commandValue": "testvalue otherValue" }
我检查了文件字节,+号确实是 char 0x2B,这是 UTF-7 中的正确字符(在 UTF-8 中也是相同的字符,不确定是否重要)。
我不明白为什么它们在阅读时消失了。
为了测试,我试过用
var content = File.ReadAllText(fileName, Encoding.UTF8);
而且效果很好。字符并没有消失。
我可能做错了什么,如何让 File.ReadAllText(fileName, Encoding.UTF7) 不忽略这些字符?
到目前为止,我还没有发现另一个有这个问题的字符,但我显然没有测试所有的字符。
【问题讨论】:
-
您确定该文件已保存为 utf 而不是 unicode?span>
-
'+' 是 UTF7 中的一个特殊字符,用于表示转义序列。就@Gusman 而言,该字符串可能不是使用UTF7 编码编写的。当您将其读取为 UTF7 时,“+”被视为转义序列的开始,但随后没有遇到有效序列,因此 UTF7 编码器只会“吃掉”“+”。如果您要在文件中的每个加号之后放置一个“-”,您的 UTF7 解码将正常工作(即所有“+”变为“+-”)......至少对于加号而言。但是,主要问题是字符串没有使用 UTF7 编码器写入文件。
-
@wablab 我知道,这就是我问的原因......
-
@Gusman,我知道你知道。 :) 我的评论是针对 OP 的,我试图承认我的评论实际上只是对您(非常有效)观点的充实。
-
你们是对的人,使用带和不带 UTF7 的 File.WriteAllText 可以证实您的说法。