修复破坏的UTF8编码

Jay*_*rox 59 php mysql unicode utf-8

我正在修复一些糟糕的UTF8编码.我目前正在使用PHP 5和MySQL

在我的数据库中,我有一些不良编码的实例,如:î

  • 数据库排序规则是utf8_general_ci
  • PHP正在使用正确的UTF8标头
  • Notepad ++设置为使用不带BOM的UTF8
  • 数据库管理在phpMyAdmin中处理
  • 并非所有重音字符都被破坏

我需要的是某种功能,它可以帮助我将î,ÃÂ,ü和其他类似的实例映射到正确的重音UTF8字符.

jsd*_*ton 93

如果您有双重编码的UTF8字符(各种智能引号,破折号,撇号,引号等),在mysql中您可以转储数据,然后将其读回以修复损坏的编码.

像这样:

mysqldump -h DB_HOST -u DB_USER -p DB_PASSWORD --opt --quote-names \
    --skip-set-charset --default-character-set=latin1 DB_NAME > DB_NAME-dump.sql

mysql -h DB_HOST -u DB_USER -p DB_PASSWORD \
    --default-character-set=utf8 DB_NAME < DB_NAME-dump.sql
Run Code Online (Sandbox Code Playgroud)

这是我的双重编码UTF-8的100%修复.

资料来源:http: //blog.hno3.org/2010/04/22/fixing-double-encoded-utf-8-data-in-mysql/

  • 似乎已成功为我转换了Typo3数据库.感谢您发布此内容; 它比任何其他转换方法都清晰得多.:) (2认同)

Seb*_*oli 80

如果你utf8_encode()在一个已经是UTF-8的字符串上,那么当它被多次编码时它看起来很乱.

我创建了一个toUTF8()将字符串转换为UTF-8 的函数.

您无需指定字符串的编码.它可以是Latin1(iso 8859-1),Windows-1252或UTF8,或者这三者的混合.

我自己在同一个字符串中使用混合编码的Feed中使用它.

用法:

$utf8_string = Encoding::toUTF8($mixed_string);

$latin1_string = Encoding::toLatin1($mixed_string);
Run Code Online (Sandbox Code Playgroud)

fixUTF8()如果它们被多次编码为UTF8,我的其他函数修复了乱码的UTF8字符串.

用法:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
Run Code Online (Sandbox Code Playgroud)

例子:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
Run Code Online (Sandbox Code Playgroud)

将输出:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Run Code Online (Sandbox Code Playgroud)

下载:

https://github.com/neitanod/forceutf8

  • 谢谢.这很神奇,不是吗?我认为这段代码是我用它解决的问题所产生的最令人满意的事情之一.:-) (6认同)
  • +1 excellent-fixUTF8甚至可以处理我见过的一些奇怪的编码错误. (2认同)

Eli*_*Eli 62

我不得不试图在过去"修复"一些UTF8破坏的情况,不幸的是,这从来都不容易,而且往往是不可能的.

除非你能确切地确定它是如何被打破的,并且它总是以完全相同的方式被打破,否则很难"消除"这种伤害.

如果您想尝试撤消损坏,最好的办法是开始编写一些示例代码,在这些代码中您尝试对mb_convert_encoding()调用进行多种变化,以查看是否可以找到"from"和"to"的组合.修复您的数据.最后,由于所涉及的痛苦程度,通常最好不要担心修复旧数据,而只是解决未来的问题.

但是,在执行此操作之前,您需要确保首先修复导致此问题的所有内容.您已经提到您的数据库表格排序和编辑器设置正确.但是有更多地方需要检查以确保所有内容都是正确的UTF-8:

  • 确保您以UTF-8的形式提供HTML:
    • header("Content-Type:text/html; charset = utf-8");
  • 将PHP默认字符集更改为utf-8:
    • ini_set("default_charset",'utf-8');
  • 如果您的数据库始终没有在utf-8中进行通信,那么您可能需要在每个连接的基础上告诉它以确保它处于utf-8模式,在MySQL中您通过发出以下命令来实现:
    • charset utf8
  • 您可能需要告诉您的网络服务器始终尝试以UTF8进行通话,在Apache中,此命令是:
    • AddDefaultCharset UTF-8
  • 最后,您需要始终确保使用正确的UTF-8投诉的PHP函数.这意味着始终使用mb_*样式的"多字节识别 "字符串函数.它还意味着在调用htmlspecialchars()等函数时,在末尾包含相应的'utf-8'charset参数,以确保它不会错误地编码它们.

如果您错过了整个过程中的任何一步,编码可能会被破坏并出现问题.一旦你进入了做utf-8的'凹槽',这一切都成了第二天性.当然,PHP6应该是来自getgo的完全unicode投诉,这将使这很容易(希望如此)


小智 12

我有一个xml文件有一个问题,它有一个破碎的编码,它说它是utf-8但它的字符不是utf-8.
经过几次试验和错误,mb_convert_encoding()我设法解决它

mb_convert_encoding($text, 'Windows-1252', 'UTF-8')
Run Code Online (Sandbox Code Playgroud)


blu*_*yed 10

正如Dan指出:你需要将它们转换为二进制,然后转换/更正编码.

例如,对于存储为latin1的utf8,以下SQL将修复它:

UPDATE table
   SET field = CONVERT( CAST(field AS BINARY) USING utf8)
 WHERE $broken_field_condition
Run Code Online (Sandbox Code Playgroud)