【问题标题】:File.ReadAllText with UTF-7 ignoring + charactersFile.ReadAllText 使用 UTF-7 忽略 + 字符
【发布时间】: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 可以证实您的说法。

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


【解决方案1】:

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

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

【讨论】:

  • 我建议在您的评论中添加有关“+-”序列的位到此答案。考虑到每个从事读写部分工作的人目前都在休假,我真的不明白他们为什么选择这些编码进行读写,并且在不知道效果的全部范围的情况下不会更改它.在获得所需输入之前,我暂时使用“+-”方法作为该用户的占位符。
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 2021-08-29
  • 2013-07-16
  • 2019-09-17
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多