Viv*_*ath 7 java ajax jquery json iso-8859-1
我有一个输出JSON的servlet.servlet的输出编码是ISO-8859-1.我们的webapp中的页面也设置为ISO-8859-1.我会使用UTF-8,但这不在我的控制之内; 我们必须使用ISO-8859-1.
当我单独点击servlet时,我可以看到已经输出的JSON数据.字符编码是正确的,没有一个字符看起来很奇怪.
但是,当我通过AJAX调用servlet并使用检索到的数据来填充选择框时,我得到了(似乎)所有具有重音符号的字符(例如我带有重音符号或重音符号,音乐符号或抑扬音符号) ).当我在Firebug下的Net选项卡中查看响应时,我可以看到文本看起来很好.但是,当我使用该数据填充选择框时,我会得到带有问号的钻石.
这些字符都是有效的ISO-8859-1字符,所以我不明白为什么它们没有正确显示.
编辑
更多信息.我用GET,jQuery.ajax我已经开始scriptCharset了ISO-8859-1.在服务器端,我已经明确地将编码设置为ISO-8859-1request.setCharacterEncoding("ISO-8859-1");
编辑
代码示例:
这就是我目前所拥有的.我scriptCharset: "ISO-8859-1"没有添加任何效果.
jQuery.ajax({
url: "/countryAndProvinceCodeServlet",
data: data,
dataType: "json",
type: "GET",
success: function(data) {
...
},
});
Run Code Online (Sandbox Code Playgroud)
我的servlet使用org.json.JSONObject并通过执行简单输出字符串response.getWriter().print(jsonObject.toString());
UPDATE
约每JSON,以及如何它应该是UTF-8的评论,我想看看我是否能获取数据为文本(所以设置dataType到text中jQuery.ajax),然后评估它作为自己的JSON(在Javascript).这似乎也不起作用!当我这样做时console.log,我仍然可以获得时髦的钻石.但是,当我在Firebug的Net选项卡下查看它时,一切都显示正常:
网络标签:
{"error":false,
"provinces":{"DZ-01":"Adrar",
"DZ-16":"Alger",
"DZ-23":"Annaba",
"DZ-44":"Aïn Defla",
"DZ-46":"Aïn Témouchent",
"DZ-05":"Batna",
"DZ-07":"Biskra",
"DZ-09":"Blida",
"DZ-34":"Bordj Bou Arréridj",
"DZ-10":"Bouira",
"DZ-35":"Boumerdès",
"DZ-08":"Béchar",
"DZ-06":"Béjaïa",
"DZ-02":"Chlef",
"DZ-25":"Constantine",
"DZ-17":"Djelfa",
"DZ-32":"El Bayadh",
"DZ-39":"El Oued",
"DZ-36":"El Tarf",
"DZ-47":"Ghardaïa",
"DZ-24":"Guelma",
"DZ-33":"Illizi",
"DZ-18":"Jijel",
"DZ-40":"Khenchela",
"DZ-03":"Laghouat",
"DZ-29":"Mascara",
"DZ-43":"Mila",
"DZ-27":"Mostaganem",
"DZ-28":"Msila",
"DZ-26":"Médéa",
"DZ-45":"Naama",
"DZ-31":"Oran",
"DZ-30":"Ouargla",
"DZ-04":"Oum el Bouaghi",
"DZ-48":"Relizane",
"DZ-20":"Saïda",
"DZ-22":"Sidi Bel Abbès",
"DZ-21":"Skikda",
"DZ-41":"Souk Ahras",
"DZ-19":"Sétif",
"DZ-11":"Tamanghasset",
"DZ-14":"Tiaret",
"DZ-37":"Tindouf",
"DZ-42":"Tipaza",
"DZ-38":"Tissemsilt",
"DZ-15":"Tizi Ouzou",
"DZ-13":"Tlemcen",
"DZ-12":"Tébessa"}}
Run Code Online (Sandbox Code Playgroud)
但是,当我console.log(text)从jQuery.ajax我得到的东西做起,我得到以下内容:
{"error":false,
"provinces":{"DZ-01":"Adrar",
"DZ-16":"Alger",
"DZ-23":"Annaba",
"DZ-44":"A?n Defla",
"DZ-46":"A?n T?mouchent",
"DZ-05":"Batna",
"DZ-07":"Biskra",
"DZ-09":"Blida",
"DZ-34":"Bordj Bou Arr?ridj",
"DZ-10":"Bouira",
"DZ-35":"Boumerd?s",
"DZ-08":"B?char",
"DZ-06":"B?ja?a",
"DZ-02":"Chlef",
"DZ-25":"Constantine",
"DZ-17":"Djelfa",
"DZ-32":"El Bayadh",
"DZ-39":"El Oued",
"DZ-36":"El Tarf",
"DZ-47":"Gharda?a",
"DZ-24":"Guelma",
"DZ-33":"Illizi",
"DZ-18":"Jijel",
"DZ-40":"Khenchela",
"DZ-03":"Laghouat",
"DZ-29":"Mascara",
"DZ-43":"Mila",
"DZ-27":"Mostaganem",
"DZ-28":"Msila",
"DZ-26":"M?d?a",
"DZ-45":"Naama",
"DZ-31":"Oran",
"DZ-30":"Ouargla",
"DZ-04":"Oum el Bouaghi",
"DZ-48":"Relizane",
"DZ-20":"Sa?da",
"DZ-22":"Sidi Bel Abb?s",
"DZ-21":"Skikda",
"DZ-41":"Souk Ahras",
"DZ-19":"S?tif",
"DZ-11":"Tamanghasset",
"DZ-14":"Tiaret",
"DZ-37":"Tindouf",
"DZ-42":"Tipaza",
"DZ-38":"Tissemsilt",
"DZ-15":"Tizi Ouzou",
"DZ-13":"Tlemcen",
"DZ-12":"T?bessa"}}
Run Code Online (Sandbox Code Playgroud)
在我看来,jQuery正在做一些奇怪的数据.
Viv*_*ath 17
我终于弄明白了.这很奇怪!
response.setCharacterEncoding(String)并不能正常工作(不知道它是否与我的设置还是什么).看起来它设置了字符编码,但由于某种原因,jQuery将它全部搞砸了.您可以像这样显式设置标题:
response.setHeader("Content-Type", "application/json; charset=ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)
谢谢各位的帮助!
编辑
我做了一些研究并查看了JavaDocs并看到了这个:
如果协议提供了一种方法,容器必须将用于servlet响应编写器的字符编码传递给客户端.在HTTP的情况下,字符编码作为文本媒体类型的Content-Type标题的一部分进行通信.注意,字符编码不能经由HTTP标头被传递如果servlet没有指定内容类型 ; 但是,它仍然用于编码通过servlet响应的编写器编写的文本.
所以上面仍然有效,但你也可以(也可能应该)这样做:
response.setContentType("application/json");
response.setCharacterEncoding("ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30553 次 |
| 最近记录: |