2014-11-24 6 views
0

웹 서비스에서 인코딩 된 문자 인 \u201c 등으로 JSON을 얻고 있습니다. 구문 분석에서 완벽하게 작동합니다. 텍스트 내부의 큰 따옴표는 인코딩 된 문자 값을 가지며 제어 따옴표는 인코딩되지 않습니다. 파서는 올바른 JSON 구조를 참조한다. 문제는 파일에 쓰고 읽은 후 JSON을 망친다는 것입니다. 더 이상 \u201c이 아니지만 내용 텍스트 안에 "자를 포함하고 있습니다. I는 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 
+3

문제를 시연하는 짧지 만 완전한 프로그램을 보여 주면 정말 도움이 될 것입니다. 진단 방법이 확실하지 않습니다 ... UTF-8을 사용해야합니다. –

+0

글쓰기는 파일 읽기 및 표시가 중요하며 이에 대한 정보가 없습니다. –

+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 유니 코드 문자 집합이 너무 유니 코드 인코딩에 대한 나쁜 선택이 아니다.

supported here으로 JSON 텍스트는 유니 코드입니다.

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 이외 다른 문제가 생각한다.

+0

ISO를 사용하고 동일한 json을 읽는 중입니다. 감사! –

+0

문제는 JToken에 의해 생성 된 문자열이 변경된다는 것입니다. –