php - Form 将特殊拉丁字符保存为符号

标签 php mysql pdo collation

我的 PHP 表单正在提交特殊的拉丁字符作为符号。

所以,Québec 变成了 Québec

我的表单设置为 UTF-8,我的数据库表具有 latin1_swedish_ci 排序规则。

PHP: $db = new PDO('mysql:host=localhost;dbname=x;charset=utf8', 'x', 'x');

绑定(bind)参数:$sql->bindParam(":x", $_POST['x'],PDO::PARAM_STR);

我是 PDO 的新手,所以我不确定问题出在哪里。谢谢

*我正在使用 phpMyAdmin

最佳答案

进一步扩展编码问题......

每当您看到源代码中的一个字符变成两个(或更多字符)时,您应该立即怀疑编码问题,尤其是在涉及 UTF-8 的情况下。这就是为什么。 (如果您已经知道其中的一些内容,我深表歉意,但我希望也能帮助 future 的一些 SO'ers。)

所有字符都不是以字符的形式存储在您的计算机中,而是以字节的形式存储。在过去,空间和传输时间比现在有限得多,所以人们试图尽可能地保存每个字节,甚至不使用完整的字节来存储一个字符。现在,因为我们意识到我们需要与整个世界交流,所以我们决定能够用每种语言代表每个角色更为重要。这种转变并不总是一帆风顺,而这正是您遇到的问题。

Latin-1(有多种形式)是一种始终对字符使用单个 8 位字节的编码。这意味着它只能有 256 个可能的字符。如果您只想写英语或瑞典语,但添加俄语和中文还不够。 (background on Latin-1)

UTF-8 以完全相同的方式对 Latin-1 的前半部分进行编码,这就是为什么您会看到大多数字符看起来都一样。但它并不总是对一个字符使用一个字节——一个字符最多可以使用四个字节。 (utf-8)正如您所发现的,它使用 2 个字节来表示 é。但是 Latin-1 并不知道这一点,并且正在尽最大努力显示这两个字节。

诀窍是始终指定字节流的编码(例如来自文件、URL 或数据库的信息),并确保编码正确。 (当然,有时很难找出答案。)大多数现代语言,如 Java 和 PHP,都能很好地处理不同编码之间的所有转换问题,只要您正确指定了要处理的内容。

关于php - Form 将特殊拉丁字符保存为符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722388/

相关文章:

mysql - 使用 2 个表中的数据对列进行全文搜索

php - 我的 PDO 声明不起作用

php - 如何从 PDO 的 fetchAll 结果中获取列名?

php - 无法在 php 的 system() 中更改用户

php - 从包含空值的数组中获取最小值

php/mysql 结果页面

php - CakePHP 烘焙错误 : Database connection "Mysql" is missing, 或无法创建

MYSQL不恰当的查询

mysql - 如何在MySQL中使用FIND_IN_SET?

php - 无法在 PDO 中连接到 mysql 数据库,在端口 8080 上使用带有 easyPHP 的 apache