【发布时间】:2011-09-03 22:22:53
【问题描述】:
我正在创建一个 MySQL 数据库,用于存储带有相关拼音发音的汉字。我已经将所有东西都设置为 UTF-8 字符集,所以我使用的大多数符号都没有问题。奇怪的是,一些某些带有音标的拉丁字符,只有当我使用 PHP 从 $_POST 将它们写入数据库时。
这些是:所有带有尖音的字符(á、é、í、ó、ú),除了ǘ(?!);以及所有带有重音的字符(à, è ì ò ù),除了ǜ。当它们被输入到表单中,并且该表单被提交到数据库时,这些字符就被切断了,就像它们从未存在过一样。例如,cháng 像 chng 一样提交。任何其他字符(带有长号,如ǎ,或长号,如ā)都可以很好地书写,实际的汉字也是如此。
再一次,我在所有可能的地方都使用 UTF-8,到目前为止,这种问题只在从表单提交数据时遇到过。之前,我运行了一个脚本来手动将一个包含这些字符的数组插入到数据库中,一切都很顺利。
有什么想法吗?
【问题讨论】:
-
我想最好给我们看一下这个表格的代码。也许其中使用的某些功能不是多字节安全的或存在其他问题。
-
我获取 $_POSTed 数据并 INSERT 到数据库的函数如下:pastebin.com/DXw7czsp
-
(a) 您是否在任何地方使用
htmlentities?有为 Latin-1 简单重音字母定义的实体,但不是双重音,因此可能会有所不同(请改用htmlspecialchars); -
(b) 确保浏览器在视图 -> 编码 -> UTF-8 中显示页面,以便所有字符都作为纯字节序列提交。如果浏览器认为该页面采用西欧编码,它将使用字节作为适合该编码的简单重音,并为双重音使用损坏的 HTML 字符引用转义,如果您不处理它,这又会产生影响对。
-
该代码粘贴中的信息不足,无法猜测发生了什么,但
filterInput()和validateInput()听起来很可疑。如果他们正在做 HTML 或 SQL 转义,那么 (a) 可能会破坏字符和 (b) 这完全是错误的方法;如果不是,那么您的查询中有 SQL 注入漏洞。
标签: mysql special-characters diacritics cjk