解决UTF8&法国口音不相容

时间:2013-07-03 08:08:05

标签: php mysql unicode utf-8

我有一个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确实支持法语口音这样的字符,但显然它不支持!

我该如何解决这个问题?

3 个答案:

答案 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 TextHandling 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;
}