php - 恢复编码错误的变音符号

标签 php mysql encoding diacritics

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

Ã?

显示为:

Ã?

但实际上应该显示为:

Ö
  1. 这里出了什么问题?我到处都使用 UTF-8。

  2. 如何在不重新创建所有内容的情况下解决此问题?

最佳答案

我在 PHP 中执行了以下命令:

<?php
echo str_replace("&", "&amp;", htmlentities("Ö", 0, "ISO-8859-1")) , '<br />';    
echo str_replace("&", "&amp;", htmlentities("Ö", 0, "UTF-8")), "</br>";
?>

str_replace 只是用来显示任何 HTML 助记符,否则会 被浏览器翻译为原始字符,这是我不希望发生的情况。

您将得到以下输出:

&Atilde;�
&Ouml;

您将识别出第一个值是您在数据库中找到的值,第二个值是您在数据库中找到的值 有点像你想要的那样。 除此之外,htmlentities 的第三个参数的默认值 depends on your PHP version如果您使用的是 5.3 版,则为 ISO-9959-1。 另请注意,未指定字符编码的 HTML 文档将 默认情况下以 ISO-8859-1 格式发布表单数据。 将所有这些结合起来可能会提供有关问题原因的线索:

我的猜测是,数据正确地以 UTF-8 形式发布到服务器,但随后 htmlentities 将其解释为非 UTF-8,单字节编码,因此将一个多字节字符转换为两个单字节字符。

现在要采取措施避免这种情况继续发生:

首先确保您的 HTML 表单具有 UTF-8 编码,因为这决定了 表单将其数据发送到服务器时使用的默认编码:

<head>
    <meta charset="UTF-8">
</head> 

确保这不会被表单标记的 accept-charset 中的其他编码所否决 属性。

然后,跳过 htmlentities 调用。你不应该把角色变成他们的 将它们存储在数据库中时的HTML助记符。数据库 支持 UTF-8 字符,因此只需这样存储即可。

对于第二个问题,您必须找到所有案例并在找到时批量替换它们 新实例。您可以通过生成一些 SQL 语句来获得一些帮助 使用如下的 PHP 脚本:

<?php
    // list all your non-ASCII characters here. Do not use str_split.
    $chars = ["Ö","õ","Ũ","ũ"];
    foreach ($chars as $ch) {
        $bad = str_replace("&", "&amp;", htmlentities($ch, 0, "ISO-8859-1"));
        echo "update mytable set myfield = replace(myfield, '$bad', '$ch') 
                where instr(myfield, '$bad') > 0;<br />";
    }
?>

该脚本的输出如下所示:

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 脚本,甚至可以自行执行更新。

希望您可以使用此信息来解决问题。

关于php - 恢复编码错误的变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467128/

相关文章:

mysql - 在 phpmyadmin 中获取 "#1452 - Cannot add or update a child row."

javascript - 输入意外结束(第 1 行)和未定义函数?

iphone - Tomcat 不解码 URL 编码字符串

php - 保存到mysql时的UTF-8问题

php - 插入多对多关系不起作用

php - 无法让脚本从 PHP 的限制输入中打印出额外的列和行

mysql IF in GROUP BY 子句

php - 在 CakePHP View 中查找未使用的变量

php - 如何避免重复连接数据库

php - 将 LAMP 堆栈安装到虚拟环境中