表单将特殊拉丁字符保存为符号

时间:2014-03-28 20:15:19

标签: php mysql pdo collation

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

所以,魁北克变成了Québec

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

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

bindParam:$sql->bindParam(":x", $_POST['x'],PDO::PARAM_STR);

我是PDO的新手,所以我不确定问题是什么。谢谢

*我正在使用phpMyAdmin

4 个答案:

答案 0 :(得分:1)

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

每当您看到源中的一个字符变成两个(或更多字符)时,您应立即怀疑编码问题,尤其是涉及UTF-8时。这就是原因。 (如果您已经了解其中的一部分,我表示歉意,但我也希望能帮助未来的SO'ers。)

所有字符都存储在您的计算机中,而不是字符,而是字节。回到过去,空间和传输时间比现在更加有限,所以人们试图保存每个字节,甚至不使用完整的字节来存储字符。现在,因为我们意识到我们需要与整个世界沟通,所以我们认为能够代表每种语言中的每个角色更为重要。这种转变并不总是顺利的,而这正是你所面临的。

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

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

诀窍是始终指定字节流的编码(如来自文件,URL或数据库的信息),并确保编码正确。 (有时确实很难找到。)大多数现代语言,如Java和PHP,在处理不同编码之间的所有翻译问题方面做得很好,只要你正确指定了你正在处理的内容。

答案 1 :(得分:0)

将数据库表和列更改为utf8_unicode_ci。

答案 2 :(得分:0)

确保使用UTF-8编码保存文件(这经常被忽略)

设置标题:

<?php header("Content-type: text/html; charset=utf-8"); ?>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

答案 3 :(得分:0)

您已经回答了自己的问题:您从表单中接收了UTF-8,但试图将其存储在Latin-1列中。您可以更改MySQL中列的编码,也可以使用iconv函数在两种编码之间进行转换。