2

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

我怎样才能解决这个问题?

4

3 回答 3

3

mysql_set_charset('utf8', $db_handle)告诉数据库您要发送的数据将以 UTF-8 编码。如果结果搞砸了,这意味着您实际上并没有发送 UTF-8 编码的文本。仔细检查您发送的内容的编码。

我认为 UTF8 确实支持像法语口音这样的字符,但显然它不支持!

我做得很好。


了解每个程序员绝对需要了解的有关编码和字符集的知识,以便在 Web 应用程序中处理文本从前到后处理 Unicode

于 2013-07-03T08:11:17.560 回答
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 与 Unicode 更一致,所以我不完全确定 PHP。)

于 2013-07-03T08:24:31.643 回答
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;
}
于 2016-02-26T16:13:29.160 回答