0

我有两个 Javascript 字符串,当传递到 console.log 时,它们会提供与 console.log 完全相同的输出,但是当我使用 SpringMVC 通过 HTTP POST 将它们传递到基于 Java Jetty 的 REST API 时,Jackson JSON 解析库会引发错误并导致服务器为第二个而不是第一个返回 400 状态代码。

这两个字符串都是在浏览器中使用textAngular工具生成的,其中,当单击切换 html/富文本按钮以编辑 html 时,两个字符串之间的唯一区别是,在被 textAngular 清理之前,一个包含一个“ ” 在 html 和另一个包含一个常规空格“”:

<p>Howdy </p>

对比

<p>Howdy&nbsp;</p>

第二个是失败的。但是,在将每个字符串传递给服务器之前,它都会被 textAngular 清理,因此输出看起来是一样的。来自 console.log 的字符串输出的两个净化版本是:

<p>Howdy </p>

所以它们应该被同等对待:要么都抛出错误,要么都通过。

console.log 是否对实际字符串变量中的 an 进行了自己的清理?或者console.log自动转换的两个字符串中的空格字符是否使用了不同的字符编码?

  1. 我如何验证我的预感,即 textAngular 的输出字符串对空格字符使用不同的字符编码?
  2. 如果这是问题,我该如何解决我的实际问题并确保输出字符串共享相同的字符编码。

更新: 我尝试在字符串上使用以下内容:

console.log(html.charCodeAt(8))

第一个字符串返回 32,第二个字符串返回 160,所以看起来它们的二进制表示实际上是不同的。我想我可以编写自己的消毒剂,将这种特定的空间编码转换为另一种编码,但是我担心可能会有其他类似这样的边缘情况具有不同的字符。我想知道是否有更好的解决方案将整个字符串强制转换为正确的字符编码。

4

1 回答 1

0

我的解决方案是在提交帖子之前添加我自己的消毒功能:

html.replace('\xa0', '&nbsp;');

其中 '\xa0' 是 160 的十六进制编码(非中断空间)。这似乎满足了服务器的 JSON 解析器;虽然我很想看看 textAngular 的消毒剂是否存在相关的字符编码问题以及可能更全面的解决方案。

于 2016-02-26T21:36:30.383 回答