我有一个PHP脚本,可以将用户内容保存到mysql数据库中(PHP 5.4,mysql 5.5.31)
我的数据库中所有与字符串相关的字段都有utf8_unicode_ci
作为整理。
我的(简化)代码如下所示:
$db_handle = mysql_connect('localhost', 'username', 'password');
mysql_select_db('my_db');
mysql_set_charset('utf8', $db_handle);
// ------ INSERT: First example -------
$s = "je viens de télécharger et installer le logiciel";
$sql = "INSERT INTO my_table (post_id, post_subject, post_text) VALUES (1, 'subject 1', '$s')";
mysql_query($sql, $db_handle);
// ------ INSERT: Second example -------
$s = "EPrints and العربية";
$sql = "INSERT INTO my_table (post_id, post_subject, post_text) VALUES (2, 'subject 2', '$s')";
mysql_query($sql, $db_handle);
// -------------
mysql_close($db_handle);
问题是,第一个插入(带有é
重音的拉丁文本)失败,除非我对此行发表评论:
mysql_set_charset('utf8', $db_handle);
但是第二个查询(拉丁语和阿拉伯语内容的混合)将失败,除非我致电mysql_set_charset('utf8', $db_handle);
我现在已经为此困难了2天了。我认为UTF8确实支持法语口音这样的字符,但显然它不支持!
我该如何解决这个问题?
答案 0 :(得分:3)
mysql_set_charset('utf8', $db_handle)
告诉数据库您要发送的数据将以UTF-8编码。如果结果搞砸了,那意味着您实际上并未发送UTF-8编码文本。仔细检查您发送的内容的编码。
我认为UTF8确实支持法语口音等字符,但显然不支持!
我做得很好。
请参阅What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text和Handling Unicode Front To Back In A Web App。
答案 1 :(得分:2)
PHP文本是否为UTF-8?这涉及编辑器的编码。如果是,那么字符串文字中的字节应该已经可以了。 似乎也是如此,因为阿拉伯语也是如此。
对SQL使用预准备语句。这有几个优点:安全性(SQL注入),转义引号和其他特殊字符,以及......可能...... SQL字符串的编码。
不太可能:尝试
$s = utf8_encode("je viens de télécharger et installer le logiciel");
虽然我可以预见到另一个问题:utf8_encode的定义需要一个ISO-8859-1字符串,对法语是可行的,但对于阿拉伯语则不行。如果这样做,PHP的编码在某种程度上是错误的。
(我发现Java与w.r.t. Unicode更加一致,所以对于PHP我并不完全确定。)
答案 2 :(得分:1)
如果需要,知道编码和转换的问题可以使用类似的东西来解决,这可以确保编码是CP1252。将其反转以确保它是UTF8。
function conv_text($value) {
$result = mb_detect_encoding($value." ","UTF-8,CP1252") == "UTF-8" ? iconv("UTF-8", "CP1252", $value ) : $value;
return $result;
}