无需编码即可写入文件

时间:2014-11-24 16:57:33

标签: c# json web-services encoding streamwriter

我从带有编码字符的网络服务中获取JSON:\u201c等。正如我解析它完美无缺:文本中的双引号具有编码字符值,而控制双引号没有编码,所以解析器看到正确的JSON结构。问题是我将它写入文件并读取后,它破坏了JSON。我在内容文本中不再有\u201c个字符,而是"个字符。

  • 如果我使用utf-8对其进行编码,则"会更改为文件分隔符(28)字符,而-会更改为控制设备3(0x13)并导致解析异常。
  • 如果我使用ascii对其进行编码,则"会更改为?个字符。
  • 如果我使用iso-8859-1对其进行编码,"将保持解码"

有没有办法在写作和阅读后保留未编码的字符?

示例:

我使用的是Newtonsoft.Json.Linq

Encoding encoding = Encoding.GetEncoding("ISO-8859-1");
webResponse = (HttpWebResponse)webRequest.GetResponse();
using (StreamReader streamReader = new StreamReader(webResponse.GetResponseStream(), encoding))
{
    responseString = streamReader.ReadToEnd();
}
JToken json = JObject.Parse(responseString);
using (StreamWriter stream = new StreamWriter(path, true, encoding))
{
    stream.Write(json.ToString());
}
string spoiledJsonString = File.ReadAllText(path, encoding);
JToken sureNotToBeCreated = JObject.Parse(spoiledJsonString); // EXCEPTION

1 个答案:

答案 0 :(得分:1)

如果我写测试程序,

using System;
using System.Diagnostics;
using System.IO;
using System.Text;

class Program
{
    private static void Main()
    {
        var encoding = Encoding.GetEncoding("ISO-8859-1");
        var testString = new string(new[] { (char)0x201c });
        string roundTripped;

        using (var m = new MemoryStream())
        {
            using(var writer = new StreamWriter(m, encoding))
            {
                var reader = new StreamReader(m, encoding);
                writer.Write(testString);
                writer.Flush();
                m.Seek(0, SeekOrigin.Begin);
                roundTripped = reader.ReadToEnd();
            }
        }
    }

    Debug.Assert(
        string.Equals(testString, roundTripped),
        "These strings should be equal.");
}

我重新创建了您的问题,报价已被转义。

如果我将编码更改为Encoding.UTF8,则会成功运行。


作为supported here,ISO-8859-1不是Unicode字符集,因此编码Unicode是一个不错的选择。

作为supported here,JSON文本是Unicode。

所以我们可以推断,ISO-8859-1是编码JSON字符串的不错选择。


该计划,

using System;
using System.Diagnostics;
using System.IO;
using System.Text;

using Newtonsoft.Json.Linq;

class Program
{
    private static void Main()
    {
        var encoding = Encoding.UTF8;
        var testJson = new JObject
            {
                new JProperty(
                    "AQuote",
                    string(new[] { (char)0x201c }))
            };

        JObject roundTripped;

        using (var m = new MemoryStream())
        {
            using(var writer = new StreamWriter(m, encoding))
            {
                var reader = new StreamReader(m, encoding);
                writer.Write(testJson.ToString());
                writer.Flush();
                m.Seek(0, SeekOrigin.Begin);
                roundTripped = JObject.Parse(reader.ReadToEnd());
            }
        }
    }

    Debug.Assert(
        string.Equals(
            testJson["AQuote"].Value<string>(),
            roundTripped["AQuote"].Value<string>()),
        "These strings should be equal.");
}

在没有警告的情况下运行,所以我怀疑你还有其他问题而不是UTF-8。