正确的字符编码


Correct character encoding

I正在编写一个文件,在保存到mysql数据库时发现文件名有错误。

原始文件名看起来有点像Thor - Thor:The Dark World,但在通过PHP将名称措辞并保存到mysql后,字符串将变为Marvels Thor:the Dark World

即使当我ECHO(保存字符串的PHP变量)时,它也会显示相同的内容,所以这与mysql无关。

我哪里做错了?有什么建议吗?

$di = new RecursiveDirectoryIterator('/var/www/example/data/');
foreach (new RecursiveIteratorIterator($di) as $filename => $file) {

        echo $file->getFilename(); //displays Marvels Thor:the Dark World
        $data[] = array('file'=>array('name'=>$file->getFilename(),'path'=>$filename)); 

}

有两件事要做…

1)设置HTTP标头的编码。例如:

header('Content-Type: text/html; charset=UTF-8')

2)设置HTML标头中的编码。例如:

echo '<!DOCTYPE hmtl>';
echo '<head>';
echo '<meta charset="utf-8">';
echo '</head>';

或者HTML5:之前

echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'

你可能还想…

3)告诉PHP使用特定的编码,例如:

ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');

4)尽可能将数据库的编码与PHP的编码相匹配。。。

为此,您可以尝试从PHP更改数据库的编码。如果使用PDO,请在连接字符串(又名DSN)中设置它,如果使用mysqli,则可以使用mysqli::set_charset。

否则使用查询:

$connection->query('set charset UTF8');

或者转换字符串(请参阅php.net上的iconv)


5)你应该知道你的编码。有字符串并且不知道它们在什么编码中意味着更少…特别是如果你正在从文件或类似的源中读取。请确保以已知的编码存储文件。


其他选择包括使用HTMLEntities。关于这样做:

函数htmlspecialchar和htmlentities不会转换编码的所有字符,只转换那些"危险"(htmlspecialchars)或具有html等效命名实体(htmlentities)的字符。如果您想要更多的控制,则需要使用mb_encode_numericentity。

问题是文件名由unicode字符组成(可能看起来像冒号),但无法在其他编码下显示(例如,ISO-8859-1或常见的西方编码)。

你要做的是找到有问题的字符(也许是我所知道的冒号),删除它,然后用键盘再次输入(如果它在记事本之类的程序中,请确保编码不是ANSI,而是UTF-8),这样就可以解决问题了。

编辑:您可能还需要在PHP文档的顶部添加以下内容(正如Hussain所说):

ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
mysql_set_charset('utf8'); // for mysql
// mysqli_set_charset($conn, 'utf8'); // for mysqli procedural]
// $mysqli->set_charset('utf8'); // for mysqli object-oriented

此外,对于输出,您可能需要:

header('Content-Type: text/html; charset=utf-8');

这可能有助于显示角色。