2008-11-08 12 views
9

Mam problem z wyświetleniem ciągu znaków JavaScript z osadzonymi sekwencjami znaków znaków Unicode (\ uXXXX), w których początkowy znak "\" jest unikany jako "& # 92;" Co muszę zrobić, aby przekształcić ciąg tak, że właściwie ocenia sekwencje i produkuje wyjście z właściwego znaku Unicode?Kod JavaScript z podwójną ucieczką Unicode

Na przykład, mam do czynienia z wejściem takich jak:

"this is a \u201ctest\u201d";

próbując rozszyfrować "& # 92;" przy użyciu regex wyrażenie, np:

var out = text.replace('/\/g','\');

wyniki w tekście wyjściowym:

"this is a \u201ctest\u201d";

czyli sekwencje escape Unicode są wyświetlane jako rzeczywistych sekwencji ucieczki, a nie podwójnych cytatów Chciałbym.

Odpowiedz

0

Nie jestem pewien, czy to jest to, ale odpowiedź może mieć coś wspólnego z eval(), czy można zaufać wejście.

+2

eval prawie nigdy nie jest właściwą odpowiedzią. –

0

Myślałam wzdłuż tych samych linii, ale za pomocą eval() w everyway mogę sobie wyobrazić spowodowało w tym samym uniknął wyjścia; np

eval(new String("this is a \u201ctest&#amp;92;u201d"));

lub nawet

eval(new String("this is a \u201ctest&#amp;92;u201d".replace('/\/g','\')));

wszystkich wyników w tej samej rzeczy:

"this is a \u201ctest\u201d";

To tak, jakby trzeba uzyskać silnik JavaScript, żeby jakoś przewartościować lub re- zanalizować ciąg, ale nie wiem, co by to zrobić. Myślałam, że może eval() lub po prostu tworząc nowy ciąg z użyciem właściwie uciekł wejście byłoby to zrobić, ale teraz szczęścia.

Fundamentalne pytanie brzmi - co muszę zrobić, aby włączyć dany ciąg:

"this is a \u201ctest&#amp;92;u201d"

na ciąg znaków, który wykorzystuje odpowiednie znaki Unicode?

6

Jak się okazuje, to unescape() chcemy, ale z '% uXXXX' zamiast '\ uXXXX':

unescape (yourteststringhere.replace (/ & # 92;/g, '%'))

+0

Nie sądzę, że to będzie działać ogólnie; unescape jest dla adresów URL, które nie obsługują wielobajtowych znaków Unicode. –

+0

Czy fakt, że istnieją 4 znaki X, wskazuje na multidyscyplinę? ;) W każdym przypadku działa dla mnie w FF3: var yourteststringhere = "Ein sch \ u00F6nes Beispiel eines mehrsprachigen Teksty: \ u65E5 \ u672C \ u8A9E"; – Kev

+0

I FF2, dodam. – Kev

1

To straszne rozwiązanie, ale można to zrobić:

var x = "this is a \u201ctest\u201d".replace(/\/g,'\\') 
// x is now "this is a \u201ctest\u201d" 
eval('x = "' + x + '"') 
// x is now "this is a “test”" 

To straszne, ponieważ:

  • eval może być niebezpieczne, jeśli nie wiesz, co jest w łańcuchu:

  • ciąg znaków cytowany w instrukcji eval zostanie zerwany, jeśli masz rzeczywisty cudzysłów w łańcuchu

+0

Nadal nie polecam tego podejścia, ale możesz uczynić to bezpieczniejszym w ten sposób: 'eval ('x ="' + x.replace (/ \/g, '\\'). Replace (/ ([^ \ \]) "/ g," $ 1 \\ "') +'" ') ' – Kip

+0

czekaj, że może jeszcze złamać na inne sposoby. masz rację, to jest straszne rozwiązanie. dając +1 wciąż, ponieważ jasno wyjaśniasz, że to straszne rozwiązanie i wyjaśnij dlaczego. – Kip

1

Czy jesteś pewien, że "\" jest jedyną postacią, która może uzyskać kod HTML? Czy jesteś pewien, że "\ uXXXX" jest jedynym rodzajem ucieczki ciągu?

Jeśli nie, potrzebny będzie uniwersalny znacznik-znak-podmiotu-dekodera HTML oraz dekoder JS-literowy-literowy. Niestety JavaScript nie ma wbudowanych metod do tego i jest dość żmudne robienie ręcznie z obciążeniem regexps.

Jest możliwość skorzystania z HTML-dekodera przeglądarki przypisując ciąg własności innerHTML elementu, a następnie poprosić JavaScript zdekodować ciąg jak powyżej:

var el= document.createElement('div'); 
el.innerHTML= s; 
return eval('"'+el.firstChild.data+'"'); 

jednak jest to niezwykle brzydki hack i luka w zabezpieczeniach, jeśli łańcuch pochodzi ze źródła, które nie jest w 100% zaufane.

Skąd pochodzą strun? Byłoby ładniej, jeśli to możliwe, aby poradzić sobie z problemem po stronie serwera, gdzie możesz mieć dostęp do bardziej zaawansowanych funkcji obsługi tekstu. A jeśli zdołasz naprawić to, co jest niepotrzebnie, uciekając przez HTML twoje backslawy, możesz znaleźć problem sam się naprawia.