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');
这可能有助于显示角色。