이를 JSON.decode
위해 사용하면 알아야 할 중요한 단점이 있습니다.
- 문자열을 큰 따옴표로 묶어야합니다.
- 많은 문자가 지원되지 않으며 스스로 이스케이프해야합니다. 예를 들어,에 다음 중 하나를 통과
JSON.decode
(따옴표에 그들을 배치 후 것은)이 모두 유효하더라도 오류가 발생하지 : \\n
, \n
, \\0
,a"a
- 16 진수 이스케이프를 지원하지 않습니다.
\\x45
- 유니 코드 코드 포인트 시퀀스를 지원하지 않습니다.
\\u{045}
다른주의 사항도 있습니다. 기본적 JSON.decode
으로 이러한 목적으로 사용하는 것은 해킹이며 항상 예상하는 방식으로 작동하지 않습니다. JSON
문자열 작업이 아니라 라이브러리를 사용하여 JSON을 처리 해야 합니다.
나는 최근에이 문제를 직접 겪었고 강력한 디코더를 원했기 때문에 결국 직접 작성했습니다. 완전하고 철저하게 테스트되었으며 여기에서 사용할 수 있습니다 : https://github.com/iansan5653/unraw . 가능한 한 JavaScript 표준을 모방합니다.
설명:
소스는 약 250 줄이므로 여기에 모두 포함하지는 않지만 기본적으로 다음 Regex를 사용하여 모든 이스케이프 시퀀스를 찾은 다음 parseInt(string, 16)
16 진수를 디코딩 String.fromCodePoint(number)
하고 해당 문자를 가져 오는 데 사용하여 구문 분석합니다 .
/\\(?:(\\)|x([\s\S]{0,2})|u(\{[^}]*\}?)|u([\s\S]{4})\\u([^{][\s\S]{0,3})|u([\s\S]{0,4})|([0-3]?[0-7]{1,2})|([\s\S])|$)/g
주석 처리됨 (참고 :이 정규식은 유효하지 않은 것을 포함하여 모든 이스케이프 시퀀스와 일치합니다. 문자열이 JS에서 오류를 발생 시키면 내 라이브러리에 '\x!!'
오류가 발생 합니다 [즉, 오류 발생]) :
/
\\ # All escape sequences start with a backslash
(?: # Starts a group of 'or' statements
(\\) # If a second backslash is encountered, stop there (it's an escaped slash)
| # or
x([\s\S]{0,2}) # Match valid hexadecimal sequences
| # or
u(\{[^}]*\}?) # Match valid code point sequences
| # or
u([\s\S]{4})\\u([^{][\s\S]{0,3}) # Match surrogate code points which get parsed together
| # or
u([\s\S]{0,4}) # Match non-surrogate Unicode sequences
| # or
([0-3]?[0-7]{1,2}) # Match deprecated octal sequences
| # or
([\s\S]) # Match anything else ('.' doesn't match newlines)
| # or
$ # Match the end of the string
) # End the group of 'or' statements
/g # Match as many instances as there are
예
해당 라이브러리 사용 :
import unraw from "unraw";
let step1 = unraw('http\\u00253A\\u00252F\\u00252Fexample.com');
let step2 = decodeURIComponent(step1);