2012-02-23 31 views
15

Tôi đang cố viết một lớp Trình trợ giúp Javascript MVC3 tùy chỉnh cho dự án của tôi và một trong các phương pháp được cho là thoát chuỗi C# thành chuỗi Javascript.Caveats Mã hóa chuỗi C# thành chuỗi Javascript

Tôi biết các chuỗi C# là UTF-16 encoded và các chuỗi Javascript also seem to be UTF-16. Không có vấn đề ở đây.

Tôi biết một số nhân vật như xuyệc ngược, dấu nháy đơn hoặc dấu ngoặc kép phải được gạch chéo ngược thoát trên javascript vậy:

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

Có caveat khác tôi phải được nhận thức trước khi viết phương pháp chuyển đổi của tôi?

EDIT: Câu trả lời hay cho đến giờ, tôi đang thêm một số tham chiếu từ câu trả lời trong câu hỏi để trợ giúp người khác trong tương lai.

Alex K. suggested using System.Web.HttpUtility.JavaScriptStringEncode, mà tôi đánh dấu là câu trả lời phù hợp với tôi, bởi vì tôi đang sử dụng Net 4. Nhưng chức năng này không có sẵn cho các phiên bản Net trước, vì vậy tôi thêm một số tài nguyên khác ở đây:

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 đã cung cấp liên kết thú vị thông báo rằng Javascript sử dụng UCS-2, là tập con của UTF-16, nhưng cách mã hóa chính xác này là một câu hỏi hoàn toàn mới.

LukeH trên các nhận xét dưới đây nhắc nhở các ký tự CR, LF và TAB, và điều đó nhắc tôi về các ký tự điều khiển (BEEP, NULL, ACK, v.v ...).

+1

Đừng quên mã hóa dòng mới, tab và bất kỳ ký tự đặc biệt nào khác. ['JavaScriptStringEncode'] (http://msdn.microsoft.com/en-us/library/system.web.httputility.javascriptstringencode.aspx), [theo đề xuất của Alex] (http://stackoverflow.com/a/ 9413664/55847), sẽ xử lý điều đó cho bạn. – LukeH

Trả lời

29

(.net 4) Bạn có thể;

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

Rất tuyệt! Tôi đang sử dụng MVC3 với .Net 4, vì vậy điều này rất hữu ích! – Machado

+0

Giải pháp cho người dùng phiên bản .net <4 là gì? –

+0

cách giải mã? – MonsterMMORPG

1

Tôi hiểu rằng bạn phải cẩn thận vì JavaScript không phải là UTF-16, đúng hơn là UCS-2 mà tôi tin là tập con của UTF-16. Điều này có ý nghĩa với bạn, là bất kỳ ký tự nào được biểu diễn hơn điểm mã cao hơn 2 byte (0xFFFF) có thể cho bạn các vấn đề trong JavaScript.

Tóm lại, dưới nắp, động cơ có thể sử dụng UTF-16, nhưng nó chỉ cho thấy các phương pháp giống như UCS-2.

Những bài báo về vấn đề này: http://mathiasbynens.be/notes/javascript-encoding

+0

Vì vậy, làm thế nào chúng ta có thể chuyển đổi một cách an toàn C# UTF-16 thành UCS-2 để mã hóa chuỗi đúng cách? – Machado

0

Thay vì sử dụng JavaScriptStringEncode() phương pháp, bạn có thể mã hóa phía máy chủ sử dụng:

HttpUtility.UrlEncode() 

Khi bạn cần phải đọc phụ chuỗi khách hàng được mã hóa, bạn phải gọi hàm unescape() javascript trước khi sử dụng chuỗi.

+1

Tại sao bạn chọn làm theo cách này? – Casey

+0

Chuỗi của tôi không phải là url, tại sao tôi sử dụng UrlEncode. Nó có vẻ ngớ ngẩn. Nhưng tôi tin nó sẽ hoạt động. – Gqqnbig

Các vấn đề liên quan