2012-02-23 16 views
15

Próbuję napisać niestandardową klasę Pomocnika MVC3 w języku Wroga dla mojego projektu, a jedna z metod powinna uciec ciągi C# do ciągów JavaScript.Usterki Kodowanie ciągu C# do łańcucha JavaScript

Wiem, że ciągi C# to UTF-16 encoded, a łańcuchy JavaScript also seem to be UTF-16. Nie ma problemu.

Znam kilka takich znaków backslash, apostrofy lub cudzysłowy muszą być odwrotny ukośnik-uciekł JavaScript tak:

\ becomes \\ 
' becomes \' 
" becomes \" 

Czy istnieją inne zastrzeżenie muszę mieć świadomość przed napisaniem moją metodę konwersji?

EDYCJA: Świetne odpowiedzi do tej pory, dodam pewne odniesienia z odpowiedzi w pytaniu, aby pomóc innym w przyszłości.

Alex K. suggested using System.Web.HttpUtility.JavaScriptStringEncode, które oznaczone jako właściwą odpowiedź dla mnie, ponieważ używam .NET 4. Ale ta funkcja nie jest dostępna do poprzednich wersji .NET, więc dodaję jakieś inne zasoby tutaj:

CR becomes \r // Javascript string cannot be broke into more than 1 line 
LF becomes \n // Javascript string cannot be broke into more than 1 line 
TAB becomes \t 

Control characters must be Hex-Escaped 

JP Richardson dała ciekawy link informujący, że JavaScript używa UCS-2, który jest podzbiorem UTF-16, ale jak poprawnie to zakodować, jest zupełnie nowym pytaniem.

LukeH na komentarzach poniżej przypomniał znaki CR, LF i TAB, które przypominały mi znaki kontrolne (BEEP, NULL, ACK itd.).

+1

Nie zapomnij o zakodowaniu nowych linii, zakładek i innych znaków specjalnych. ['JavaScriptStringEncode'] (http://msdn.microsoft.com/en-us/library/system.web.httputility.javascriptstringencode.aspx), [zgodnie z sugestią Alex] (http://stackoverflow.com/a/ 9413664/55847), obsłuży to dla ciebie. – LukeH

Odpowiedz

29

(.net 4) Można;

System.Web.HttpUtility.JavaScriptStringEncode(@"aa\bb ""cc"" dd\tee", true); 
== 
"aa\\bb \"cc\" dd\\tee" 
+1

Nice! Używam MVC3 z .Net 4, więc jest to bardzo przydatne! – Machado

+0

Jakie jest rozwiązanie dla użytkowników wersji .net <4? –

+0

jak rozszyfrować? – MonsterMMORPG

1

To moja zrozumienie, że trzeba być ostrożnym, gdyż JavaScript nie jest UTF-16, to raczej UCS-2, który moim zdaniem jest podzbiorem UTF-16. Oznacza to, że każdy znak, który jest reprezentowany niż wyższy punkt kodowy o długości 2 bajtów (0xFFFF) może powodować problemy w JavaScript.

Podsumowując, pod maskami silnik może korzystać z UTF-16, ale ujawnia tylko metody podobne do UCS-2.

Świetny artykuł o numerze: http://mathiasbynens.be/notes/javascript-encoding

+0

Jak możemy bezpiecznie przetransformować C# UTF-16 na UCS-2, aby kodować łańcuch w odpowiedni sposób? – Machado

0

Zamiast używać JavaScriptStringEncode() metody można zakodować po stronie serwera przy użyciu:

HttpUtility.UrlEncode() 

Kiedy trzeba odczytać zakodowany stronie klienta łańcuch, trzeba zadzwoń pod unescape() funkcję javascript przed użyciem ciągu znaków.

+1

Dlaczego chcesz to zrobić w ten sposób? – Casey

+0

Mój ciąg nie jest adresem URL, dlaczego używam UrlEncode. Wydaje się głupie. Ale wierzę, że to zadziała. – Gqqnbig