jQuery AJAX 调用弄乱了字符编码

2023-11-23

我有一个输出 JSON 的 servlet。 Servlet 的输出编码是 ISO-8859-1。我们的网络应用程序中的页面也设置为 ISO-8859-1。我会使用 UTF-8,但这超出了我的控制范围;我们必须使用 ISO-8859-1。

当我单独点击servlet时,我可以看到已经输出的JSON数据。字符编码是正确的,并且没有一个字符看起来很奇怪。

然而,当我通过 AJAX 调用 servlet 并使用检索到的数据填充选择框时,我得到 � 代替(看起来)所有带重音的字符(例如带有重音或锐音、分音符号或扬抑符号的 i) )。当我查看 Firebug 下的“网络”选项卡中的响应时,我可以看到文本看起来不错。但是,当我使用该数据填充选择框时,我得到了带问号的菱形。

这些字符都是有效的 ISO-8859-1 字符,所以我不明白为什么它们没有正确显示。

EDIT

更多信息。我用GET in jQuery.ajax我已经设置了scriptCharset to ISO-8859-1。在服务器端,我已使用以下命令将编码显式设置为 ISO-8859-1request.setCharacterEncoding("ISO-8859-1");

EDIT

代码示例:

这就是我目前所拥有的。我添加了scriptCharset: "ISO-8859-1"没有效果。

        jQuery.ajax({
            url: "/countryAndProvinceCodeServlet",
            data: data,
            dataType: "json",
            type: "GET",
            success: function(data) {
               ...
            },
        });

我的servlet使用org.json.JSONObject并简单地输出字符串response.getWriter().print(jsonObject.toString());

UPDATE

根据有关 JSON 的评论以及它应该如何为 UTF-8,我尝试查看是否可以将数据作为文本获取(因此设置dataType to text in jQuery.ajax),然后我自己将其评估为 JSON(在 Javascript 中)。这似乎也不起作用!当我做console.log,我仍然得到了时髦的钻石。然而,当我在 Firebug 的“网络”选项卡下查看它时,一切都显示正常:

Net tab:

{"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"}}

但当我这样做时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"}}

在我看来,jQuery 对数据做了一些奇怪的事情。


我终于弄明白了。这很奇怪!

response.setCharacterEncoding(String) does not工作(不知道这是否与我的设置有关或什么)。看起来它设置了字符编码,但由于某种原因 jQuery 把它搞乱了。您已显式设置标题,如下所示:

response.setHeader("Content-Type", "application/json; charset=ISO-8859-1");

谢谢各位的帮助!

EDIT

我做了一些研究并检查了JavaDocs并看到了这个:

如果协议提供了这样做的方法,则容器必须将 servlet 响应编写器使用的字符编码传达给客户端。对于 HTTP,字符编码作为文本媒体类型的 Content-Type 标头的一部分进行通信。注意字符编码cannot通过 HTTP 标头进行通信如果 servlet 未指定内容类型;但是,它仍然用于对通过 Servlet 响应的编写器编写的文本进行编码.

所以上面的方法仍然有效,但你也可以(并且可能应该)这样做:

response.setContentType("application/json");
response.setCharacterEncoding("ISO-8859-1"); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery AJAX 调用弄乱了字符编码 的相关文章

随机推荐

  • Rails 可选 /:locale 路线

    我正在尝试为我的 Rails 应用程序设置一个路由系统 该系统允许将可选路由 locale 允许到网站的底部 所以或多或少 en home 将转到与 home 相同的页面 en people gt people 我遇到的唯一问题是在路由配置
  • GoogleCertificatesRslt:Kotlin Android 应用程序中不允许

    我正在开发一个使用 Kotlin 作为开发语言的 Android 应用程序 该应用程序显示地图并应该加载标记 但是 地图会加载 但标记不会加载 我收到安全异常GoogleCertificatesRslt not allowed我发现这可能是
  • 检测前景窗口何时发生变化

    我知道哪个使用GetForegroundWindow函数我可以获取当前活动窗口句柄 但是现在i want to detect when the active window of any application changes become
  • QTabWidget 大小取决于当前选项卡

    I ve a QTabWidget 其中包含不同高度的小部件 它们的宽度是固定的 但是 默认实现QTabWidget选择最大的部件的高度作为自己的高度 我想知道是否有一种 可能快速 的方法来改变大小QTabWidget取决于其当前选项卡 以
  • 删除 Activity 作为默认启动器

    我将我的活动设置为默认启动器来拦截主页按钮点击 如下所示
  • AngularJS 中的滚动事件

    我有一个带有滚动条的 div 现在我想获取一个事件 每次用户滚动时都会触发该事件 这在 AngularJS 中可能吗 还是我必须使用 jQuery Edit 到目前为止我想出了以下内容 JS directive scroll functio
  • 没有名为“fbprophet”的模块?

    我尝试按照以下说明在 Ubuntu 上的 Anaconda 中安装 Facebook Prophet https facebook github io prophet docs installation html installation
  • pip 和 conda 之间的实际区别

    我看到了有关 pip 和 conda 之间差异的其他问题 但我还不清楚 请在标记为重复之前考虑这一点 如果我跑pip install seaborn and conda install seaborn我会得到同样的结果吗 我可以跑pip i
  • 更好的错误处理[重复]

    这个问题在这里已经有答案了 Here https github com astaxie build web application with golang blob master en 11 1 md描述了如何根据 http 包使用自定义路
  • IPython 导入失败和 python sys.path 一般情况

    我正在关注这个post让一个 ipython 统治所有 virtualenvs 据我了解 这篇文章的主要思想是 当在 virtualenv 中时 ipython 找不到它的模块 a virtualenv me pc ipython Trac
  • 从服务器 HTTPS 接收并验证证书 - android

    我正在通过 https 从 Android 客户端调用 Web 服务 我必须验证从服务器端收到的证书 我怎么做 目前 这是我用来调用网络服务的代码 private static String SendPost String url Arra
  • 如何在 Jekyll 中链接到没有 html 扩展名的 page.url 页面?

    我正在 Jekyll 中建立一个网站 为了删除帖子中的 html 扩展名 我将以下内容添加到 config yml permalink kb title 为了从页面中删除 html 扩展名 我为每个页面创建了文件夹 并在每个页面文件夹中放置
  • 如何有条件地为表格单元格中的背景着色?

    我正在渲染一个表格p 数据表 PrimeFaces 我想要做的是根据单元格内容的值对单元格的背景进行着色 这与为行或列着色不同 它是单个单元格 首先是CSS问题 如果我这样做
  • 从 HTML 页面源下载图像文件

    我正在编写一个抓取工具 用于从 HTML 页面下载所有图像文件并将它们保存到特定文件夹中 所有图像都是 HTML 页面的一部分 下面是一些代码 用于从提供的 URL 下载所有图像 并将它们保存在指定的输出文件夹中 您可以根据自己的需要对其进
  • Flutter widget 测试选择另一个项目时不会触发 DropdownButton.onChanged

    我正在编写一个 Flutter Web 应用程序 并向我的代码库添加一些小部件测试 我很难让 flutter test 按预期工作 我当前面临的问题是尝试在 DropdownButton 中选择一个值 以下是重现问题的完整小部件测试代码 v
  • 添加和删​​除 JLabel 上的图标

    您好 我有一个标签 我已为其设置了图标 我想在单击按钮后删除此图标 它的方法是什么 Create icon Icon icon new ImageIcon getClass getResource foo bar baz png Creat
  • 掩蔽者在 SHAP 包中真正做了什么并让他们适合训练或测试?

    我一直在努力与shap包裹 我想从我的逻辑回归模型中确定形状值 与此相反TreeExplainer the LinearExplainer需要一个所谓的掩蔽器 这个掩码器到底有什么作用 独立掩码器和分区掩码器有什么区别 另外 我对测试集中的
  • Windows中当前目录和工作目录的区别

    Windows 中的当前目录和工作目录有什么区别 如何更改 Notepad 或 Mozilla Firefox 等应用程序的工作目录 当前目录和工作目录只是同一事物的两个不同名称 每个进程维护一个当前目录 当前目录在启动时指定为用于创建进程
  • 正则表达式在尊重 CDATA 的同时转义 HTML 和符号

    我编写了一个内容管理系统 它使用服务器端正则表达式在页面响应发送到客户端浏览器之前对页面响应中的 符号进行转义 正则表达式会注意已转义的或属于 HTML 实体一部分的 符号 例如 以下内容 a b c amp d copy 2009 更改为
  • jQuery AJAX 调用弄乱了字符编码

    我有一个输出 JSON 的 servlet Servlet 的输出编码是 ISO 8859 1 我们的网络应用程序中的页面也设置为 ISO 8859 1 我会使用 UTF 8 但这超出了我的控制范围 我们必须使用 ISO 8859 1 当我