Chrome表单POST显示“(无法解码值)”,数据库将其存储为问号

时间:2014-08-27 20:26:22

标签: google-chrome unicode utf-8 character-encoding windows-1252

我的测试网站和测试数据库都设置为windows-1252。当我在Chrome中键入 Alt + 234 时,会将此符号放在字段Ω中。当我提交表单时,它会将其发布并存储为Ω我假设这是浏览器说" 嘿,这不是在指定的字符集中但我做的知道一个html等价物,所以我会发布"。精细。保存后符号显示正常,我可以保存,保存,保存,它总是显示正常。但是如果我用 Alt + 230 尝试同样的事情,浏览器就不会提交它的html实体值µ。相反,我看到"(无法解码价值)"在Chrome DevTool窗口中查看POST时。它最终作为问号存储在数据库中。

为什么它以 Alt + 230 的方式处理 Alt + 234 Ω) (µ)?

我知道我应该切换到UTF8,但我仍然想知道它为什么会这样运作。谢谢!

2 个答案:

答案 0 :(得分:0)

U + 03A9 Ω希腊大写字母欧米茄不属于Windows code page 1252

U + 00B5 µ微符号(与希腊语mu不完全相同)是1252(字节181)的一部分。

Alt +键盘快捷键号码与代码页1252或一般的当前ANSI代码页不对齐,因此能够从该快捷方式键入字符并不意味着这些代码页的成员身份。相反,它们来自DOS code page 437

  

当我提交表单时,它发布并将其存储为Ω我假设这是浏览器说“嘿,这不是在指定的字符集中,但我知道一个html等价物,所以我会发布相反“

是的,这是一个长期存在的奇怪的不可恢复的错误,HTML5最终标准化,因为当一个字符在页面请求的编码中不可编码时。

  

相反,我在Chrome DevTool窗口中查看POST时看到“(无法解码值)”。它最终作为问号存储在数据库中。

浏览器将该字符作为代码页1252字节181发送。无论你的应用程序是什么,并不期望处理代码页1252字节...可能他们期望UTF-8。因为字节181本身不是有效的UTF-8序列,所以它们无法保留它。

答案 1 :(得分:0)

对发送的变量使用encodeURIcomponent可以解决此问题。

损坏:

`?value=${myValue}`

工作:

`?value=${encodeURIcomponent(myValue)}`