10

提供的答案都很棒,我在 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 | 
4

7 回答 7

18

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

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

如果您从数据库中提取值并将其显示在 UTF-8 兼容终端上(或在声明为 UTF-8 编码的网页上),它将再次看起来像一个正常的井号。

于 2008-12-22T14:43:19.757 回答
8

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

了解如何手动识别和解码 UTF-8 很有用 - 检查wikipedia 页面以获取有关编码如何工作的信息:

  • 0xC2A3 = 110 00010 10 100011
  • 粗体部分是实际的“有效负载”,它给出了 10100011,即 0xA3,即英镑符号。
于 2008-12-22T14:45:10.767 回答
7

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

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

或者在其他平台上触发对 inconv 命令的系统调用(linux / osx)

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

于 2010-11-10T23:59:06.597 回答
2

您需要以 utf-8 编码提供您的 HTML(我认为实际上每个人都需要这样做!)标题如下:

内容类型:文本/html;字符集=UTF-8

或等价物。仔细检查细节。应该始终将字符集声明为浏览器可以默认为它喜欢的任何内容。

于 2008-12-22T15:52:34.623 回答
1

要删除 Â,请使用:

$column = str_replace("\xc2\xa0", '', $column);

学分等:如何使用 PHP 删除字符串中所有出现的 c2a0?

于 2014-12-03T03:58:11.807 回答
0

非常感谢。我一直怀疑 mysql 破坏了英镑符号。现在我需要做的就是生成 csv 记录的任何地方,只需使用 wrap them incov 功能。虽然这是一份好工作,但我很高兴,至少有人确切地展示了该做什么。我真诚地感谢展示以前和新的“标题”值。这对我帮助很大。

-标记

于 2009-07-02T14:40:54.257 回答
0

如果您将“50,000 英镑的开发挑战”行保存在两个不同的数据类型列中,即“varchar”和“text”字段。

在我保存之前,我已使用以下函数将符号替换为 html equi 值。str_replace("£", "£", $title);

您会发现存储在文本字段中的值是 £,而 varchar 中的值是 "£"。

于 2010-08-05T16:00:05.663 回答