提供的答案都很棒,我在Alnitak的回答中提到我需要查看我的CSV生成脚本,因为无论出于什么原因它都没有输出UTF-8.
正如正确指出的那样,它输出了UTF-8 - Ye Olde Microsoft Excel存在的问题并没有像我希望的那样获取编码.
我现有的CSV代看起来像:
// Create file and exit; $filename = $file."_".date("Y-m-d_H-i",time()); header("Content-type: application/vnd.ms-excel"); header("Content-disposition: csv" . date("Y-m-d") . ".csv"); header( "Content-disposition: filename=".$filename.".csv"); echo $csv_output;
它现在看起来像:
// Create file and exit; $filename = $file."_".date("Y-m-d_H-i",time()); header("Content-type: text/csv; charset=ISO-8859-1"); header("Content-disposition: csv" . date("Y-m-d") . ".csv"); header("Content-disposition: filename=".$filename.".csv"); echo iconv('UTF-8', 'ISO-8859-1', $csv_output);
原始问题
嗨,
我有一个收集数据的表单,表单工作正常,但我注意到如果有人键入或使用'£'符号,MySQL DB最终会得到'£'.
不确定在何处或如何阻止这种情况发生,代码和数据库信息要遵循:
MySQL细节
mysql> SHOW COLUMNS FROM fraud_report; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | | PRI | NULL | auto_increment | | crm_number | varchar(32) | YES | | NULL | | | datacash_ref | varchar(32) | YES | | NULL | | | amount | varchar(32) | YES | | NULL | | | sales_date | varchar(32) | YES | | NULL | | | domain | varchar(32) | YES | | NULL | | | date_added | datetime | YES | | NULL | | | agent_added | varchar(32) | YES | | NULL | | +--------------+--------------+------+-----+---------+----------------+ 8 rows in set (0.03 sec)
PHP函数
function processFraudForm($crm_number, $datacash_ref, $amount, $sales_date, $domain, $agent_added) { // Insert Data to DB $sql = "INSERT INTO fraud_report (id, crm_number, datacash_ref, amount, sales_date, domain, date_added, agent_added) VALUES (NULL, '$crm_number', '$datacash_ref', '$amount', '$sales_date', '$domain', NOW(), '$agent_added')"; $result = mysql_query($sql) or die (mysql_error()); if ($result) { $outcome = "Emails sent and database updated."; } else { $outcome = "Something went wrong!"; } return $outcome; }
示例DB输入
+----+------------+--------------+---------+------------+--------------------+---------------------+------------------+ | id | crm_number | datacash_ref | amount | sales_date | domain | date_added | agent_added | +----+------------+--------------+---------+------------+--------------------+---------------------+------------------+ | 13 | 100xxxxxxx | 10000000 | £10.93 | 18/12/08 | blargh.com | 2008-12-22 10:53:53 | agent.name |
Alnitak.. 17
您所看到的是UTF-8编码 - 它是一种以相对紧凑的格式存储Unicode字符的方法.
磅符号0x00a3
在Unicode中具有值,但是当它以UTF-8编写时,它就变成0xc2 0xa3
了存储在数据库中的内容.您的数据库表似乎已设置为使用UTF-8编码.这是件好事!
如果从数据库中取出值并将其显示在兼容UTF-8的终端上(或在声明为UTF-8编码的网页上),它将再次显示为正常的井号.
您所看到的是UTF-8编码 - 它是一种以相对紧凑的格式存储Unicode字符的方法.
磅符号0x00a3
在Unicode中具有值,但是当它以UTF-8编写时,它就变成0xc2 0xa3
了存储在数据库中的内容.您的数据库表似乎已设置为使用UTF-8编码.这是件好事!
如果从数据库中取出值并将其显示在兼容UTF-8的终端上(或在声明为UTF-8编码的网页上),它将再次显示为正常的井号.
££是0xC2 0xA3,它是£符号的UTF-8编码 - 因此你将它存储为UTF-8,但可能将其视为Latin-1或UTF-8以外的其他东西
了解如何手动发现和解码UTF-8非常有用 - 查看维基百科页面,了解编码的工作原理:
0xC2A3 = 110 00010 10 100011
粗体部分是实际的"有效载荷",它给出了10100011,即0xA3,即英镑符号.
在PHP中,另一个小规模的解决方案是在返回的utf8字符串上进行字符串转换:
print iconv('UTF-8', 'ASCII//TRANSLIT', "Mystring â"); //"Mystring "
或者在其他平台上激活系统调用inconv命令(linux/osx)
http://php.net/manual/en/function.iconv.php#83238