恢复编码严重的变音符号

时间:2015-11-01 20:57:58

标签: php mysql encoding diacritics

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

Ã?

显示为:

Ã?

但实际上应该显示为:

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

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

2 个答案:

答案 0 :(得分: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 对于您使用的版本5.3,版本为depends on your PHP versionISO-9959-1HTML。 还要意识到没有指定字符编码的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("&", "&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

当然,您可以决定创建一个甚至可以自行更新的Database-First脚本。

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

答案 1 :(得分:0)

对于PDO,请使用类似

的内容
php -i

$db = new PDO('dblib:host=host;dbname=db;charset=UTF-8', $user, $pwd); 有两三个出错的地方,而不仅仅是一个! &Atilde;?C396的utf8十六进制或两个字符Ö的latin1十六进制。获得Ö或黑色钻石需要出现其他问题。

让我们看看表中的内容;做

?

(如果您已经完成了之前建议的SELECT col, HEX(col) FROM tbl WHERE ... ,那么该表可能会更糟糕。或者它可能会被修复。)