programing

JSON 및 이스케이프 문자

bestprogram 2023. 4. 2. 12:01

JSON 및 이스케이프 문자

Javascript에서 JSON으로 serialize된 후 Java로 serialize된 문자열이 있습니다.

문자열에 도 기호가 포함되어 있으면 문제가 발생하는 것 같습니다.

누구를 탓해야 할지 알아내는 데 도움이 좀 필요할 것 같아요

  • Spidermonkey 1.8 실장입니까?(JSON 구현이 내장되어 있습니다)
  • 구글 지슨인가요?
  • 내가 뭘 제대로 못 해서 그런가?

JSDB에서는 다음과 같은 일이 발생합니다.

js>s='15\u00f8C'
15°C
js>JSON.stringify(s)
"15°C"

나는 예상했을 것이다."15\u00f8C'그래서 스파이더몬키의 JSON 구현이 제대로 이루어지지 않고 있다는 생각이 듭니다.다만, JSON 홈페이지의 구문 설명(그것이 사양입니까?)에 char는 사용할 수 있다고 기재되어 있습니다.

any-Unicode-character-except-or-or-control-character(유니코드 문자 예외 문자)

따라서 \u00f8로 인코딩하지 않고 그대로 문자열을 전달할 수 있습니다.이 경우 Gson 라이브러리의 문제라고 생각합니다.

누구 도와줄 사람?

회피책은 다른 JSON 라이브러리를 사용하거나 호출 후 직접 문자열을 이스케이프하는 것입니다.JSON.stringify()--하지만 이것이 버그라면 버그 리포트를 제출하고 싶습니다.

이것은 어느 실장에서도 버그가 아닙니다.U+00B0 를 이스케이프 할 필요는 없습니다.RFC를 인용하려면:

2.5 스트링

문자열의 표현은 프로그래밍 언어의 C 패밀리에서 사용되는 표기법과 유사합니다.문자열은 따옴표로 시작하고 끝납니다.이스케이프할 필요가 있는 문자(따옴표, 역솔리더스 및 제어 문자)를 제외하고, 모든 Unicode 문자를 따옴표 안에 넣을 수 있습니다(U+0000 ~U+001F).

임의의 문자를 이스케이프 할 수 있습니다.

모든 것을 이스케이프하면 데이터의 크기가 커집니다(모든 코드 포인트는 모든 Unicode 변환 형식에서 4바이트 이하로 나타낼 수 있지만, 모두 인코딩하면 6바이트 또는 12바이트가 됩니다).

코드 어딘가에 텍스트트랜스코딩 버그가 있어 ASCII 서브셋 내의 모든 것을 이스케이프하여 문제를 은폐할 가능성이 높습니다.모든 데이터가 Unicode 인코딩을 사용하는 것은 JSON 사양의 요건입니다.

음, 어쨌든 여기 회피책이 있습니다.

function JSON_stringify(s, emit_unicode)
{
   var json = JSON.stringify(s);
   return emit_unicode ? json : json.replace(/[\u007f-\uffff]/g,
      function(c) { 
        return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
      }
   );
}

테스트 케이스:

js>s='15\u00f8C 3\u0111';
15°C 3◄
js>JSON_stringify(s, true)
"15°C 3◄"
js>JSON_stringify(s, false)
"15\u00f8C 3\u0111"

이것은 매우 늦었고 아마도 더 이상 관련이 없을 것입니다만, 만약 누군가가 이 답을 우연히 발견한다면, 저는 그 원인을 알 수 있다고 생각합니다.

따라서 JSON 인코딩된 문자열은 다른 답변에서 언급되었듯이 도 기호를 사용하여 완벽하게 유효합니다.이 문제는 읽기/쓰기 시 사용하는 문자 인코딩에서 발생할 수 있습니다.에 따라 Gson을 될.java.io.Reader★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Reader InputStream문자 인코딩을 지정해야 합니다.java.nio.charset.Charset통상은 (instance)를 사용하는 좋습니다java.nio.charset.StandardCharsets.UTF_8를 하지 경우CharsetJava는 플랫폼의 디폴트 부호화를 사용합니다.Windows 에서는 보통 CP-1252 입니다.

언급URL : https://stackoverflow.com/questions/4901133/json-and-escaping-characters