出于某种原因,我的特殊字符在mysql数据库中被编码为以下字符串:
Ã?
显示为:
Ã?
但实际上应该显示为:
Ö
这里出了什么问题?我到处都使用UTF-8。
如何在不重新创建所有内容的情况下解决此问题?
答案 0 :(得分:2)
我在PHP
执行了以下内容:
<?php
echo str_replace("&", "&", htmlentities("Ö", 0, "ISO-8859-1")) , '<br />';
echo str_replace("&", "&", htmlentities("Ö", 0, "UTF-8")), "</br>";
?>
str_replace
只是为了揭示任何HTML
助记符,否则就会出现这种情况
由浏览器翻译成原始角色,我不想发生。
您将获得此输出:
�
Ö
您将第一个值识别为您在数据库中找到的值,第二个值
有点像你想要的那样。
除此之外,第三个参数的默认值为htmlentities
对于您使用的版本5.3,版本为depends on your PHP
version,ISO-9959-1
为HTML
。
还要意识到没有指定字符编码的ISO-8859-1
文档会
默认情况下,以UTF-8
格式发布表单数据。
结合所有这些可能会给出问题原因的线索:
我的猜测是数据被正确地发布到服务器htmlentities
,但是UTF-8
将其解释为非HTML
单字节编码,因此转为1,多字节字符分成两个单字节字符。
现在采取措施,这不会继续发生:
首先确保您的UTF-8
表单具有<head>
<meta charset="UTF-8">
</head>
编码,因为这决定了
表单用于将其数据发送到服务器的默认编码:
accept-charset
确保不会被表单标记htmlentities
中的其他编码推翻
属性。
然后,跳过HTML mnemonic
电话。你不应该把角色变成他们的
将它们存储在数据库中时UTF-8
。 MySQL的
支持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
当然,您可以决定创建一个甚至可以自行更新的Database-First
脚本。
希望您可以使用此信息来解决问题。
答案 1 :(得分:0)
对于PDO,请使用类似
的内容php -i
$db = new PDO('dblib:host=host;dbname=db;charset=UTF-8', $user, $pwd);
有两三个出错的地方,而不仅仅是一个!
Ã?
是C396
的utf8十六进制或两个字符Ö
的latin1十六进制。获得Ö
或黑色钻石需要出现其他问题。
让我们看看表中的内容;做
?
(如果您已经完成了之前建议的SELECT col, HEX(col) FROM tbl WHERE ...
,那么该表可能会更糟糕。或者它可能会被修复。)