Bunun için kullanmak JSON.decode
, bilmeniz gereken önemli dezavantajlarla birlikte gelir:
- Dizeyi çift tırnak içine almalısınız
- Birçok karakter desteklenmez ve kendilerinin kaçması gerekir. Örneğin, için aşağıdakilerden herhangi geçen
JSON.decode
(çift tırnak onları tamamlamasından sonra) bunların hepsi geçerli olsa bile hata olacaktır: \\n
, \n
, \\0
,a"a
- Onaltılık çıkışları desteklemez:
\\x45
- Unicode kod noktası dizilerini desteklemez:
\\u{045}
Başka uyarılar da var. Esasen, JSON.decode
bu amaçla kullanmak bir hack'tir ve her zaman beklediğiniz gibi çalışmaz. JSON
Kütüphaneyi dize işlemlerini değil, JSON'u işlemek için kullanmaya devam etmelisiniz .
Geçenlerde bu konuyla kendim karşılaştım ve sağlam bir kod çözücü istedim, bu yüzden kendim bir tane yazdım. Eksiksiz ve kapsamlı bir şekilde test edilmiştir ve burada mevcuttur: https://github.com/iansan5653/unraw . JavaScript standardını olabildiğince yakından taklit eder.
Açıklama:
Kaynak yaklaşık 250 satırdır, bu yüzden hepsini buraya dahil etmeyeceğim, ancak esasen tüm kaçış dizilerini bulmak için aşağıdaki Regex'i kullanır ve ardından bunları parseInt(string, 16)
16 tabanlı sayıların kodunu çözmek ve ardından String.fromCodePoint(number)
karşılık gelen karakteri elde etmek için ayrıştırır :
/\\(?:(\\)|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
Yorumlandı (NOT: Bu normal ifade, geçersiz olanlar da dahil olmak üzere tüm kaçış dizileriyle eşleşir. Dize, JS'de bir hata atarsa, kitaplığımda bir hata atar [yani, '\x!!'
hata verir]):
/
\\ # 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
Misal
Bu kitaplığı kullanarak:
import unraw from "unraw";
let step1 = unraw('http\\u00253A\\u00252F\\u00252Fexample.com');
let step2 = decodeURIComponent(step1);