所提供的答案都很棒,我在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 = "<div id=\"success\">Emails sent and database updated.</div>"; } else { $outcome = "<div id=\"error\">Something went wrong!</div>"; } return $outcome; }
示例数据库条目
+----+------------+--------------+---------+------------+--------------------+---------------------+------------------+ | 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 |
您将看到的是UTF-8编码- 这是一种以相对紧凑的格式存储Unicode字符的方法。
英镑符号0x00a3在Unicode中具有值,但是当它以UTF-8编写时,它即成为0xc2 0xa3存储在数据库中的内容。您的数据库表似乎已设置为使用UTF-8编码。这是 一件好事 !
0x00a3
0xc2 0xa3
如果您从数据库中拉出值并将其显示在UTF-8兼容终端(或声明为UTF-8编码的网页)上,它将再次看起来像是普通的井号。