我的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
答案 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函数在两种编码之间进行转换。