正确的字符编码

时间:2013-12-07 05:46:25

标签: php mysql character-encoding

我正在编写一个文件,并在保存到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)); 


}

2 个答案:

答案 0 :(得分:2)

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

你需要做的是找到有问题的字符(也许是冒号,我知道),删除它,然后用键盘再次键入它(如果它在记事本这样的程序中,请确保编码不是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');

这可能有助于展示角色。

答案 1 :(得分:2)

有两件事要做......

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');

...或转换字符串(参见iconv at php.net)。


5 )你应该知道你的编码。拥有字符串并且不知道它们所处的编码是什么意思...特别是如果您正在从文件或类似的源读取。确保以已知编码存储文件。


其他替代方案包括使用HTMLEntities。这样做:

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