我在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 和 ISO-9959-1 在版本 5.3 的情况下,您使用的那个。
还要意识到没有指定字符编码的HTML 文档将
默认情况下以ISO-8859-1 格式发布表单数据。
结合所有这些可能会提供有关问题原因的线索:
我的猜测是数据以UTF-8 正确发布到服务器,但随后htmlentities 将其解释为非UTF-8,单字节编码,因此将一个多字节字符转换为两个单字节字符。
现在要采取措施避免这种情况继续发生:
首先确保您的HTML 表单具有UTF-8 编码,因为这决定了
表单将用于将其数据发送到服务器的默认编码:
<head>
<meta charset="UTF-8">
</head>
确保这不会被表单标签的accept-charset 中的另一种编码所推翻
属性。
然后,跳过htmlentities 电话。你不应该把角色变成他们的
HTML mnemonic 将它们存储在数据库中时。 mysql
支持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 脚本,它甚至可以自己进行更新。
希望您可以使用此信息来解决问题。