Php 还原错误编码的umlauts
出于某种原因,我的特殊字符在mysql数据库中被编码为以下字符串:Php 还原错误编码的umlauts,php,mysql,encoding,diacritics,Php,Mysql,Encoding,Diacritics,出于某种原因,我的特殊字符在mysql数据库中被编码为以下字符串: Ã? 具体表现为: Ã? 但实际上应该表现为: Ö 这里出了什么问题?我在任何地方都使用UTF-8 如何在不重新创建所有内容的情况下修复此问题 我在PHP中执行了以下操作: <?php echo str_replace("&", "&", htmlentities("Ö", 0, "ISO-8859-1")) , '<br />'; echo str_
Ã?
具体表现为:
Ã?
但实际上应该表现为:
Ö
我在
PHP
中执行了以下操作:
<?php
echo str_replace("&", "&", htmlentities("Ö", 0, "ISO-8859-1")) , '<br />';
echo str_replace("&", "&", htmlentities("Ö", 0, "UTF-8")), "</br>";
?>
您将识别第一个值,即您在数据库中找到的值,以及第二个值
有点像你想要的。
此外,第三个参数的默认值为htmlentities
对于您使用的版本5.3,是ISO-9959-1
。
还要认识到,没有指定字符编码的HTML
文档将
默认情况下,以ISO-8859-1
格式发布表单数据。
将所有这些结合起来可能会给出问题原因的线索:
我的猜测是,数据被正确地作为UTF-8
发布到服务器,但是htmlentities
将其解释为非UTF-8
单字节编码,从而将一个多字节字符转换为两个单字节字符
现在,我们来看看为防止这种情况继续发生而采取的措施:
首先确保您的HTML
表单具有UTF-8
编码,因为这决定了
表单将用于向服务器发送数据的默认编码:
<head>
<meta charset="UTF-8">
</head>
此脚本的输出如下所示:
update mytable set myfield = replace(myfield, 'Ã�', 'Ö') where instr(myfield, 'Ã�') > 0;
update mytable set myfield = replace(myfield, 'õ', 'õ') where instr(myfield, 'õ') > 0;
update mytable set myfield = replace(myfield, 'Ũ', 'Ũ') where instr(myfield, 'Ũ') > 0;
update mytable set myfield = replace(myfield, 'Å©', 'ũ') where instr(myfield, 'Å©') > 0;
当然,您可以决定制作一个PHP
脚本,它甚至可以自己进行更新
希望您可以使用这些信息来解决问题。对于PDO,请使用以下内容
$db = new PDO('dblib:host=host;dbname=db;charset=UTF-8', $user, $pwd);
Ã代码>是不是有两三件事出错了,而不仅仅是一件!
C396
是表示Ö
的utf8十六进制,或表示两个字符Ö
的拉丁文十六进制。要想得到?
或黑钻石,还需要其他东西出错
让我们看看桌子上有什么;做
SELECT col, HEX(col) FROM tbl WHERE ...
(如果您已经执行了前面建议的replace()
,则该表可能处于更糟糕的混乱状态。或者它可能已修复。)字符是如何进入这些实体的?该字符表示法对于实体是正确的。Ã;?真的应该表现为Ã?。我认为问题在于过去发生了什么inserted@BartScheffer我想你的意思是我的猜测是Ö在值被插入数据库之前就出了问题。Ö的utf-8序列有一个在ANSI中为Ã的第一个字节,如果错误地将其解释为ANSI,这将转义为HTML,那么您将得到所读取的内容。似乎不是数据库本身所做的操作类型。就是在输入过程中出错了。你能显示插入的代码吗?也许你应该使用$event=html\u entity\u decode(strip\u tags($\u POST[“event”])代码>感谢您的详细回答!第一部分是正确的!这是由dev服务器和live服务器上不同的php版本引起的。关于第二部分,我明天可能不得不回到你身边,因为今天我现在不能测试这个脚本。
$db = new PDO('dblib:host=host;dbname=db;charset=UTF-8', $user, $pwd);
SELECT col, HEX(col) FROM tbl WHERE ...