我正在编写一个文件,并在保存到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));
}
答案 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。这样做:
函数htmlspecialchars和htmlentities不会转换编码的所有字符,只会转换为“危险”(htmlspecialchars)或具有html等效命名实体(htmlentities)的字符。如果您想要更多控制权,则需要使用mb_encode_numericentity。