2008-08-25 16 views
36

Trong ứng dụng web của tôi, tôi gửi một số trường biểu mẫu với phương thức jQuery $.getJSON(). Tôi đang gặp một số vấn đề với mã hóa. Bộ ký tự của ứng dụng của tôi là charset=ISO-8859-1 nhưng tôi cho rằng các trường này được gửi với UTF-8.Cách đặt mã hóa trong .getJSON JQuery

Có ai biết, làm cách nào tôi có thể đặt mã hóa trong các cuộc gọi $.getJSON?

+1

Theo [này] (http://stackoverflow.com/a/13098683/95735) câu trả lời tôi t bất hợp pháp để chỉ định bộ ký tự cho 'application/json'. –

+1

** ILLEGAL? ** Tôi hy vọng tôi không bị bắt vì cố gắng ... – jbowman

Trả lời

32

Tôi nghĩ rằng có thể bạn sẽ phải sử dụng $.ajax() nếu bạn muốn thay đổi bảng mã, xem param contentType dưới đây (successerror callbacks giả sử bạn có <div id="success"></div><div id="error"></div> trong html):

$.ajax({ 
    type: "POST", 
    url: "SomePage.aspx/GetSomeObjects", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: "{id: '" + someId + "'}", 
    success: function(json) { 
     $("#success").html("json.length=" + json.length); 
     itemAddCallback(json); 
    }, 
    error: function (xhr, textStatus, errorThrown) { 
     $("#error").html(xhr.responseText); 
    } 
}); 

Tôi thực sự chỉ cần làm điều này khoảng một giờ trước, thật trùng hợp!

+1

Tôi đã chỉ ra rằng bạn ghi đè đối tượng lưu trữ XMLHttpRequest bên trong phương thức lỗi. Nó chỉ là một vấn đề của thực hành mã hóa tốt không để nhầm lẫn các nhà phát triển khác;) Tôi sẽ đề nghị đổi tên nó thành cái gì khác;) – Wilq32

+0

làm thế nào là 'xhr' âm thanh? ;-) – travis

+0

Tốt hơn nhiều :) (trên thực tế tôi thường đặt tên giống như bây giờ:>) – Wilq32

42

Nếu bạn muốn sử dụng $.getJSON() bạn có thể thêm những điều sau đây trước khi cuộc gọi:

$.ajaxSetup({ 
    scriptCharset: "utf-8", 
    contentType: "application/json; charset=utf-8" 
}); 

Bạn có thể sử dụng charset bạn muốn thay vì utf-8.

Các tùy chọn được giải thích here.

contentType : Khi gửi dữ liệu đến máy chủ, hãy sử dụng content-type này. Mặc định là application/x-www-form-urlencoded, điều này là tốt cho hầu hết các trường hợp.

scriptCharset : Chỉ dành cho các yêu cầu với jsonp hoặc script loại dữ liệu và loại GET. Buộc yêu cầu được hiểu là một bộ ký tự nhất định. Chỉ cần cho sự khác biệt về ký tự giữa nội dung từ xa và nội bộ.

Bạn có thể cần một hoặc cả hai ...

+3

hi Pat, tôi gặp vấn đề về thiết lập loại nội dung với phương thức getJSON.Tôi đã sử dụng $ .ajaxSetup ngay trước khi gọi getJSON, nhưng không có thay đổi nào xảy ra, ký tự "nordic" trở thành ký tự rác trong DB của tôi. bạn có thể cho tôi biết thứ tự chính xác của việc gọi điện toán học không? thnx – Bhupi

+1

Theo [this] (http://stackoverflow.com/a/13098683/95735) trả lời nó là bất hợp pháp để chỉ định charset cho 'application/json'. –

+0

Tôi đã gặp vấn đề tương tự với bài đăng và đang sử dụng $ .ajax (...) gọi thay vì $ .post (...) bởi vì tôi không có cách nào để thay đổi loại nội dung. Điều này cho phép tôi sử dụng ký hiệu $ .post viết tắt để khớp với $ .get mà tôi đang sử dụng. Tôi tin rằng đây nên là câu trả lời được chấp nhận bởi vì nó hoạt động và cho phép sử dụng $ .getJSON(). – eesh

1

Sử dụng encodeURI() trong ứng dụng JS và sử dụng trong các công trình URLDecoder.decode() Java phía máy chủ.


Ví dụ:

  • Javascript:

    $.getJSON(
        url, 
        { 
         "user": encodeURI(JSON.stringify(user)) 
        }, 
        onSuccess 
    ); 
    
  • Java:

    java.net.URLDecoder.decode(params.user, "UTF-8");

4

Bạn cần phải phân tích JSON cuộc gọi sử dụng Wireshark, vì vậy bạn sẽ thấy nếu bạn bao gồm các ký tự trong sự hình thành của trang JSON hay không, ví dụ:

  • Nếu trang là đơn giản nếu text/html
 
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 
0010 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 .Content -Type: t 
0020 65 78 74 2f 68 74 6d 6c 0d 0a 43 61 63 68 65 2d ext/html ..Cache- 
0030 43 6f 6e 74 72 6f 6c 3a 20 6e 6f 2d 63 61 63 68 Control: no-cach 
  • Nếu trang của các loại bao gồm tùy chỉnh JSON với MIME "charset = ISO-8859-1"
 
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 
0010 0a 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 .Cache-C ontrol: 
0020 6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6e 74 65 6e no-cache ..Conten 
0030 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d t-Type: text/htm 
0040 6c 3b 20 63 68 61 72 73 65 74 3d 49 53 4f 2d 38 l; chars et=ISO-8 
0050 38 35 39 2d 31 0d 0a 43 6f 6e 6e 65 63 74 69 6f 859-1..C onnectio 

Tại sao lại như vậy? bởi vì chúng tôi không thể đặt trên trang của JSON một mục tiêu như thế này:

Trong trường hợp của tôi, tôi sử dụng các nhà sản xuất Kết nối Me 9210 Digi:

  • tôi đã phải sử dụng một lá cờ để chỉ ra rằng người ta sẽ sử dụng MIME không chuẩn: p-> theCgiPtr-> = fDataType eRpDataTypeOther;
  • Nó đã thêm MIME mới trong biến: strcpy (p-> theCgiPtr-> fOtherMimeType, "text/html; charset = ISO-8859-1");

Nó làm việc cho tôi mà không cần phải chuyển đổi dữ liệu thông qua JSON cho UTF-8 và sau đó thực hiện lại việc chuyển đổi trên trang ...

0

Sử dụng chức năng này để lấy lại các nhân vật utf-8

function decode_utf8(s) { 

    return decodeURIComponent(escape(s)); 

} 

dụ:

var new_Str=decode_utf8(str);