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

gfr*_*ius 6 unicode google-chrome utf-8 character-encoding windows-1252

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

为什么它治疗Alt+ 234?)不同于Alt+ 230µ)?

我知道我应该切换到 UTF8,但我仍然想知道为什么它会以这种方式运行。谢谢!

Luc*_*cio 5

使用encodeURIComponent包装值解决了问题。

破碎的:

`?value=${myValue}`
Run Code Online (Sandbox Code Playgroud)

在职的:

`?value=${encodeURIComponent(myValue)}`
Run Code Online (Sandbox Code Playgroud)


bob*_*nce 0

U+03A9\xce\xa9希腊大写字母 omega 不是Windows 代码页 1252的一部分。

\n\n

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

\n\n

Alt+键盘快捷键数字与代码页 1252 或一般的当前 ANSI 代码页不一致,因此能够通过该快捷键键入字符并不意味着属于这些代码页。相反,它们来自DOS 代码页 437

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

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

\n