如何转换这些奇怪的字符?(ë,Ã,ì,ù,Ã)

62
我的页面经常显示像ë,Ã,ì,ù,Ã在正常字符的位置。
我在标题页和MySQL编码中使用utf8。这是怎么发生的?

1
你需要添加更多的上下文。这些字符出现在哪里?你的表格采用什么编码方式?检索数据的代码是什么样子的... - Pekka
9
在Latin-1字符集网站上显示的是UTF-8序列。最好的选择是在您的网页中添加<meta charset="UTF-8">,或者在您的PHP脚本顶部使用header("Content-Type: text/html; charset=utf-8");。我假设这实际上还没有发生。 - mario
4个回答

49

这些是UTF-8编码的字符。使用utf8_decode()将它们转换成普通的ISO-8859-1字符。


5
可能会发生这种情况来解决手头的问题,但更好的做法是在一开始就正确处理所有编码。 - Pekka
1
当我将字符串发送到数据库时,我总是使用utf8_encode()(当然还有mysql_real_escape_string)。在输出页面上使用utf8_decode()。但你说这是错误的,我不知道,你会如何处理? - Ray
6
utf8_encode() 和 utf8_decode() 可以将数据从 ISO-8859-1 编码转换为 UTF-8 编码并相反。在现代网站设置中,如果数据库、数据库连接和输出页面的编码均为 UTF-8,则不再需要进行这些转换。这是从头开始构建 PHP 项目时的推荐方式。虽然它可能可以解决 OP 所展示的问题,但在可能的情况下解决问题的根本原因会更可取。 - Pekka
你甚至可能需要使用它两次。 - javier_domenech

28
如果你看到这些字符,可能只是因为没有正确指定字符编码。因为当使用单字节编码(如ISO 8859-1Windows-1252)解释UTF-8多字节字符串时,这些字符就会出现。

在这种情况下,ë可以用0xC3 0xAB进行编码,表示UTF-8中的Unicode字符ë(U+00EB)。


如何使用0xC3 0xAB进行编码,以在UTF-8中表示Unicode字符ë(U+00EB)? - Leonardo
2
字符 ë 在 Unicode 字符集中的代码点为 0xEB,并且使用 UTF-8 编码时编码为 0xC3AB。但是,当使用不同的字符编码进行解释时,这个字节序列代表的内容也会有所不同。例如,在 ISO 8859-1 和 Windows-1252 中,它表示两个字符 Ã(0xC3)和 «(0xAB)。 - Gumbo

16

尽管 utf8_decode 是一个有用的解决方案,但我更喜欢在表格本身上纠正编码错误。在我看来,更好的方法是直接纠正不良字符,而不是在代码中进行“黑科技”处理。只需在表格字段上执行replace即可纠正 OP 中的不良编码字符。

update <table> set <field> = replace(<field>, "ë", "ë")
update <table> set <field> = replace(<field>, "Ã", "à")
update <table> set <field> = replace(<field>, "ì", "ì")
update <table> set <field> = replace(<field>, "ù", "ù")

其中<table>是mysql表的名称,<field>是表中列的名称。以下是一个非常好的清单,适用于通常将错误编码的windows-1252转换为utf-8字符 -> Debugging Chart Mapping Windows-1252 Characters to UTF-8 Bytes to Latin-1 Characters

记得在尝试使用SQL替换任何字符之前备份您的表格

[我知道这是对一个非常旧的问题的回答,但我再次遇到了这个问题。一些旧的Windows机器在将文本插入到utf8_general_ci排序的表之前没有正确地进行编码。]


1
我发现一个有用的转换器,可以识别错误的字符:https://www.charset.org/utf8-to-latin-converter。 - Gawrion
@Gawrion,+1 对于传统系统来说非常不错。 - davidkonrad

5

我实际上找到了一种适用于我的方法。它将文本转换为二进制,然后转换为UTF8。

源文本存在编码问题: If ‘Yes’, what was your last

SELECT CONVERT(CAST(CONVERT(
    (SELECT CONVERT(CAST(CONVERT(english_text USING LATIN1) AS BINARY) USING UTF8) AS res FROM m_translation WHERE id = 865) 
USING LATIN1) AS BINARY) USING UTF8) AS 'result';

纠正后的结果文本:

如果是‘是’,你上一次使用的是什么?

我的源代码被错误地编码了两次,所以我不得不进行两次修复。只需一次修复,您可以使用以下命令:

SELECT CONVERT(CAST(CONVERT(column_name USING latin1) AS BINARY) USING UTF8) AS res FROM m_translation WHERE id = 865;

请原谅我可能出现的格式错误。

救命稻草!谢谢。 - Patrick Savalle
1
谢谢你,我刚刚遇到了一个问题,那就是从旧系统导出的翻译文件乱码了。这个问题困扰了我一段时间,因为它不是通常的 utf-8 <-> windows-1252/iso-8859 混淆。你的想法帮助我发现了问题所在,原来源文件最初是 utf-8 的,但被错误地双重“转换”成了 utf-8。在 Notepad++ 中打开并将其读取为 utf-8 编码,然后将其转换为 ANSI,再将其读取为 utf-8 编码并再次转换为 ANSI,最后将其读取为 utf-8 编码即可解决问题。 - Sev Roberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接