好的,我目前处于PHP / MySQL / UTF-8 / Unicode地狱!
我的环境:
的MySQL:5.1.53
服务器字符集:latin1
DB字符集:latin1
客户特征集:latin1
康涅狄格州字符集:latin1
的PHP:5.3.3
我的PHP文件保存为UTF-8格式,而不是ASCII文件。
在建立数据库连接时,在我的PHP代码中执行以下操作:
ini_set('default_charset', 'utf-8');
$my_db = mysql_connect(DEV_DB, DEV_USER, DEV_PASS);
mysql_select_db(MY_DB);
// I have tried both of the following utf8 connection functions
// mysql_query("SET NAMES 'utf8'", $my_db);
mysql_set_charset('utf8', $my_db);
// Detect if form value is not UTF-8
if (mb_detect_encoding($_POST['lang_desc']) == 'UTF-8') {
$lang_description = $_POST['lang_desc'];
} else {
$lang_description = utf8_encode($_POST['lang_desc']);
}
$language_sql = sprintf(
'INSERT INTO app_languages (language_id, app_id, description) VALUES (%d, %d,"%s")',
intval($lang_data['lang_id']),
intval($new_app_id),
mysql_real_escape_string($lang_description, $my_db)
);
我的MySQL数据库的格式/创建是:
CREATE TABLE IF NOT EXISTS app_languages (
language_id int(10) unsigned NOT NULL,
app_id int(10) unsigned NOT NULL,
description tinytext collate utf8_unicode_ci,
PRIMARY KEY (language_id,app_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
从我的PHP代码生成的SQL语句如下所示:
INSERT INTO app_languages (language_id, app_id, description) VALUES (91, 2055,"阿拉伯体育新闻和信息")
INSERT INTO app_languages (language_id, app_id, description) VALUES (26, 2055,"阿拉伯體育新聞和信息")
INSERT INTO app_languages (language_id, app_id, description) VALUES (56, 2055,"?????? ????? ????? ?????")
INSERT INTO app_languages (language_id, app_id, description) VALUES (69, 2055,"アラビア語のスポーツニュースと情報")
但是,输出在我的数据库中显示为:
| 69 | 2055 | ????????????????? |
| 56 | 2055 | ?????? ????? ????? ????? |
| 28 | 2055 | Arapski sportske vijesti i informacije |
| 42 | 2055 | Arabe des nouvelles sportives et d\'information |
| 91 | 2055 | ?????????? |
我究竟做错了什么??
附言 我们可以使用Putty直接通过SSH SSH到数据库服务器,并通过命令行粘贴unicode /多语言插入语句之一。 他们成功地工作了!
感谢您对此的理解,这使我发疯。
干杯,杰森
选择数据库后,尝试执行以下查询:
SET NAMES 'utf8'
此查询应使用文件和数据库中的不同字符集解决问题。
费利克斯
非常感谢。 您的回答解决了我的严重问题。
好答案。 我有同样的问题,所以它解决了我的问题。 非常感谢
答案是正确的在您的问题。 您在整个数据库中都使用latin1,它无法处理unicode。 您还需要将其更改为UTF-8。
不,那是不正确的,因为您会在我的评论中看到" P.S.我们可以使用Putty通过命令行直接通过SSH SSH到数据库服务器,粘贴unicode /多语言insert语句之一。它们成功地工作了!!"
@Jason您确定腻子使用的是正确的编码吗? thegreyblog.blogspot.com/2009/08/
@bobo,是的,那正是Putty如何处理编码的方式,它是UTF-8。
我看到您将其视为???????的单词是阿拉伯语单词..必须具有排序规则
cp1256_general_ci
不
UTF-8_general_ci
改变它,可能会解决问题。
除非您已经知道要处理的内容,否则mb_detect_encoding几乎没有用。 除非您指定第二个和第三个参数,否则您可能不应该依赖它。 当前,它可能不会返回您认为的结果。
//first make sure your file produce utf-8 chars
header('Content-Type: text/html; charset=utf-8');