Php 如何转换这些奇怪的字符?(Ã;«;Ã;Ã;¬;Ã;¹;Ã;)

Php 如何转换这些奇怪的字符?(Ã;«;Ã;Ã;¬;Ã;¹;Ã;),php,mysql,character-encoding,mojibake,utf8-decode,Php,Mysql,Character Encoding,Mojibake,Utf8 Decode,我的页面经常显示像Ã~,Ã,Ã,Ã,Ã,Ã之类的东西来代替普通字符 我使用utf8作为标题页,使用MySQL编码。这是怎么发生的?这些是utf-8编码字符。用于将它们转换为普通ISO-8859-1字符。如果您看到这些字符,您可能只是没有看到。因为这些字符是使用单字节编码(如或)解释UTF-8多字节字符串时的结果 在这种情况下,ë可以用0xC3 0xAB编码,0xC3 0xAB表示UTF-8中的Unicode字符ë(U+00EB)。即使utf8ādecode是一个有用的解决方案,我还是更愿意更正

我的页面经常显示像Ã~,Ã,Ã,Ã,Ã,Ã之类的东西来代替普通字符


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

这些是utf-8编码字符。用于将它们转换为普通ISO-8859-1字符。

如果您看到这些字符,您可能只是没有看到。因为这些字符是使用单字节编码(如或)解释UTF-8多字节字符串时的结果


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

即使
utf8ādecode
是一个有用的解决方案,我还是更愿意更正表本身的编码错误。在我看来,与其在代码中进行“破解”,不如自己更正错误字符。只需在桌上的场地上做一个简单的练习。要更正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>, "ù", "ù")
updateset=replace(,“ë”,“ë”)
更新集=替换(,“Ô,“Ô)
更新集=替换(,“Ô,“ì”)
更新集=替换(,“Ãü”,“ù”)
其中,
是mysql表的名称,
是表中列的名称。下面是一个非常好的检查列表,用于那些通常编码错误的windows-1252到utf-8字符->

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


[我知道这是一个非常老的问题的答案,但我再次面临这个问题。一些旧的windows机器在将文本插入utf8\u general\u ci对照表之前没有对其进行正确编码。]

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

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

更正结果文本: 如果“是”,你最后一次是什么

我的源代码被错误地编码了两次,所以我有两个人做了两次。仅此一次,您可以使用:

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

请原谅任何格式错误

您需要添加更多上下文。这些字符显示在哪里,您的表采用什么编码,检索数据的代码是什么样子的……当显示在拉丁字符集网站上时,这些是UTF-8序列。最好的选择是将
添加到页面中,或者使用
标题(“内容类型:text/html;charset=utf-8”)在PHP脚本之上。我假设实际情况并非如此。这可能恰好解决了手头上的问题,但从一开始就让过程中的所有编码都正确就更好了。在向数据库发送字符串时,我总是使用utf8_encode()(当然还有mysql_real_escape_string)。在输出页面使用utf8_decode()。但是你说那是错误的,我不知道,你会如何处理这个问题?utf8_encode()和utf8_decode将数据从ISO-8859-1转换为ISO-8859-1。在数据库、数据库连接和输出页面编码为UTF-8的现代网站设置中,将不再需要进行这些转换。这是从头开始构建PHP项目时推荐的方法。虽然它可能会解决OP显示的问题,但在其根位置解决问题(如果可能的话)更为可取。您甚至可能需要使用它两次,以表示Unicode字符ë(U+00EB)的0xC3 0xAB编码在UTF-8中,字符
ë
在Unicode字符集中有代码点0xEB,并在UTF-8中用0xC3AB编码。但是当用不同的字符编码解释时,这个字节序列确实代表了一些不同的东西。例如,在ISO 8859-1和Windows-1252中,它表示两个字符
Ã
(0xC3)和
«
(0xAB)。
SELECT CONVERT(CAST(CONVERT(column_name USING latin1) AS BINARY) USING UTF8) AS res FROM m_translation WHERE id = 865;