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

Php 表单将特殊拉丁字符保存为符号,php,mysql,pdo,collation,Php,Mysql,Pdo,Collation,我的PHP表单正在提交特殊的拉丁字符作为符号 所以,魁北克变成了魁北克 我的表单设置为UTF-8,我的数据库表具有拉丁文1\u瑞典文\u ci排序规则 PHP:$db=newpdo('mysql:host=localhost;dbname=x;charset=utf8','x','x') 一个bindParam:$sql->bindParam(“:x”,$\u POST['x'],PDO::PARAM_STR) 我是PDO的新手,所以我不确定问题出在哪里。多谢各位 *我正在使用phpMyAdmi

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

所以,魁北克变成了魁北克

我的表单设置为UTF-8,我的数据库表具有拉丁文1\u瑞典文\u ci排序规则

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

一个bindParam:
$sql->bindParam(“:x”,$\u POST['x'],PDO::PARAM_STR)

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


*我正在使用phpMyAdmin

将数据库表和列更改为utf8\u unicode\u ci。

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

设置标题:

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

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


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

要详细介绍编码问题

当您看到源代码中的一个字符变为两个(或更多)字符时,您应该立即怀疑编码问题,尤其是涉及UTF-8的情况下。原因如下。(如果您已经知道其中一些,我很抱歉,但我希望也能帮助一些未来的销售人员。)

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

Latin-1(各种风格)是一种编码,总是使用单个8位字节作为字符。这意味着它只能有256个可能的字符。如果你只想写英语或瑞典语,就足够了,但不足以加上俄语和汉语

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


诀窍是始终指定字节流的编码(如来自文件、URL或数据库的信息),并确保编码正确。(有时这确实是一个很难发现的问题。)大多数现代语言,如Java和PHP,只要您正确指定了要处理的内容,就可以很好地处理不同编码之间的所有翻译问题。

您不能用utf-8完成所有工作吗?您是否要求您的数据库需要有拉丁字符集?在一个应用程序中使用多个字符集当然是可能的,但需要详细的计划和注意。在将字符串存储到数据库之前将其转换为拉丁语1,并在打印之前将其转换为输出字符集(可能是utf-8)。我将我的DB table列更改为UTF8,并将php头和meta设置为UTF8。同样的结果。您建议如何将所有更改为UTF8?我将列更改为UTF8_unicode_ci,问题仍然存在。我将列更改为UTF8_unicode_ci,问题仍然存在。是否有方法将PDO更改为latin1?这可能会帮助您:@DDDD:如果您想将PDO连接更改为latin1,将连接字符串中的
charset=utf8
更改为
charset=latin1
。在使用PHP和MySQL时,两个文件在使用什么字符编码方面保持一致是至关重要的,请参见form.PHP还是action PHP文件?我添加了头和元。将DB table列更改为UTF8,并且仍然相同。