Php 还原错误编码的umlauts

Php 还原错误编码的umlauts,php,mysql,encoding,diacritics,Php,Mysql,Encoding,Diacritics,出于某种原因,我的特殊字符在mysql数据库中被编码为以下字符串: &Atilde;? 具体表现为: Ã? 但实际上应该表现为: Ö 这里出了什么问题?我在任何地方都使用UTF-8 如何在不重新创建所有内容的情况下修复此问题 我在PHP中执行了以下操作: <?php echo str_replace("&", "&amp;", htmlentities("Ö", 0, "ISO-8859-1")) , '<br />'; echo str_

出于某种原因,我的特殊字符在mysql数据库中被编码为以下字符串:

&Atilde;?
具体表现为:

Ã?
但实际上应该表现为:

Ö
  • 这里出了什么问题?我在任何地方都使用UTF-8

  • 如何在不重新创建所有内容的情况下修复此问题


  • 我在
    PHP
    中执行了以下操作:

    <?php
    echo str_replace("&", "&amp;", htmlentities("Ö", 0, "ISO-8859-1")) , '<br />';    
    echo str_replace("&", "&amp;", 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, '&Atilde;�', 'Ö') where instr(myfield, '&Atilde;�') > 0;
    update mytable set myfield = replace(myfield, '&Atilde;&micro;', 'õ') where instr(myfield, '&Atilde;&micro;') > 0;
    update mytable set myfield = replace(myfield, '&Aring;&uml;', 'Ũ') where instr(myfield, '&Aring;&uml;') > 0;
    update mytable set myfield = replace(myfield, '&Aring;&copy;', 'ũ') where instr(myfield, '&Aring;&copy;') > 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 ...