如何转换这些奇怪的字符? (�, �, �, �, �)

问题描述 投票:0回答:4

我的页面经常显示诸如 à、à、à、à、à 之类的内容来代替普通字符。

我使用 utf8 作为标题页和 MySQL 编码。这是怎么发生的?

php mysql utf-8 character-encoding mojibake
4个回答
50
投票

这些是 utf-8 编码的字符。使用 utf8_decode() 将它们转换为正常的 ISO-8859-1 字符。


29
投票

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

在这种情况下,

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


17
投票

尽管

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 字符,这里有一个非常好的检查表 -> 调试图表将 Windows-1252 字符映射到 UTF-8 字节到 Latin-1 字符

请记住在尝试使用 SQL 替换任何字符之前先备份表

[我知道这是一个非常老的问题的答案,但再次面临这个问题。一些旧的 Windows 机器在将文本插入 utf8_general_ci 整理表之前没有正确编码文本。]


6
投票

我实际上找到了对我有用的东西。它将文本转换为二进制,然后转换为 UTF8。

存在编码问题的源文本: 如果“是”,您最后一次是什么

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;

如有任何格式错误,请原谅

© www.soinside.com 2019 - 2024. All rights reserved.