当前位置:  开发笔记 > 编程语言 > 正文

每当使用£时,MySQL或PHP都附加一个Â

如何解决《每当使用£时,MySQL或PHP都附加一个Â》经验,为你挑选了3个好方法。

提供的答案都很棒,我在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编码的网页上),它将再次显示为正常的井号.



1> Alnitak..:

您所看到的是UTF-8编码 - 它是一种以相对紧凑的格式存储Unicode字符的方法.

磅符号0x00a3在Unicode中具有值,但是当它以UTF-8编写时,它就变成0xc2 0xa3了存储在数据库中的内容.您的数据库表似乎已设置为使用UTF-8编码.这是件好事!

如果从数据库中取出值并将其显示在兼容UTF-8的终端上(或在声明为UTF-8编码的网页上),它将再次显示为正常的井号.



2> Paul Dixon..:

££是0xC2 0xA3,它是£符号的UTF-8编码 - 因此你将它存储为UTF-8,但可能将其视为Latin-1或UTF-8以外的其他东西

了解如何手动发现和解码UTF-8非常有用 - 查看维基百科页面,了解编码的工作原理:

0xC2A3 = 110 00010 10 100011

粗体部分是实际的"有效载荷",它给出了10100011,即0xA3,即英镑符号.


谢谢,很好的答案帮助我理解了为什么 - Alnitak得到了接受,因为它帮助我理解了如何解决!+ 1upvote

3> Ben..:

在PHP中,另一个小规模的解决方案是在返回的utf8字符串上进行字符串转换:

print iconv('UTF-8', 'ASCII//TRANSLIT', "Mystring â"); //"Mystring "

或者在其他平台上激活系统调用inconv命令(linux/osx)

http://php.net/manual/en/function.iconv.php#83238

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有