由于某种原因,我的特殊字符在 mysql 数据库中被编码为以下字符串:
Ã?
显示为:
Ã?
但实际上应该显示为:
Ö
这里出了什么问题?我到处都使用 UTF-8。
如何在不重新创建所有内容的情况下解决此问题?
最佳答案
我在 PHP
中执行了以下命令:
<?php
echo str_replace("&", "&", htmlentities("Ö", 0, "ISO-8859-1")) , '<br />';
echo str_replace("&", "&", htmlentities("Ö", 0, "UTF-8")), "</br>";
?>
str_replace
只是用来显示任何 HTML
助记符,否则会
被浏览器翻译为原始字符,这是我不希望发生的情况。
您将得到以下输出:
�
Ö
您将识别出第一个值是您在数据库中找到的值,第二个值是您在数据库中找到的值
有点像你想要的那样。
除此之外,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("&", "&", 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, 'Ã�', 'Ö') 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
脚本,甚至可以自行执行更新。
希望您可以使用此信息来解决问题。
关于php - 恢复编码错误的变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467128/