【问题标题】:MySQL or PHP is appending a  whenever the £ is used每当使用 £ 时,MySQL 或 PHP 都会附加一个 Â
【发布时间】:2010-09-28 00:48:56
【问题描述】:

提供的答案都很棒,我在 Alnitak 的答案的 cmets 中提到,我需要查看我的 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 | 

【问题讨论】:

  • 我猜你在这里学到了一些东西。但是,joelonsoftware.com/articles/Unicode.html 有一篇非常好的初学者文章——“每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有任何借口!)”——它提供了字符编码如何以及为什么是它是如何工作的。
  • 我知道你已经读过了。但是,我会让评论保留。它是了解字符编码是什么的好资源。

标签: php mysql character


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,每天都学点新东西,现在来弄清楚如何让我的 CSV 生成脚本输出 UTF-8 :)
  • 如果您正在输出 CSV 并且它包含 C2A3 序列,则它已经 UTF-8 - 读取 CSV 的任何内容都需要理解它或被告知期待 UTF- 8.
  • 井号在 Ansi 代码页中是 0xA3,在 Unicode 中是 0x00A3,这就是为什么该字符在 DB 中看起来很正常。但总的来说,非 ASCII 字符的 UTF-8 版本的效果不太好。
  • 确实——巧合的是 0xA3 的 UTF-8 编码的第二个字节也恰好是 0xA3 !
  • 如果你看看编码是如何工作的,这并不是巧合。十进制范围 128-191 中的任何 8 位字符的前两位二进制数字为 10,这与 UTF-8 前导位相同,因此该范围内的 char n 编码为 0xC2 n
【解决方案2】:

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

了解如何手动识别和解码 UTF-8 很有用 - 查看wikipedia page 了解有关编码如何工作的信息:

  • 0xC2A3 = 110 00010 10 100011
  • 粗体部分为实际 “有效载荷”,给出 10100011, 即 0xA3,英镑符号。

【讨论】:

  • 谢谢,很好的回答帮助我理解了原因 - Alnitak 获得了接受,因为它帮助我理解了如何修复! +1 点赞
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

    内容类型:文本/html; charset=UTF-8

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

    【讨论】:

      【解决方案5】:

      要删除 Â 使用:

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

      学分等:How to remove all occurrences of c2a0 in a string with PHP?

      【讨论】:

        【解决方案6】:

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

        -标记

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          • 试图回答大约两年前已经回答的问题似乎有点奇怪。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-12
          • 2021-08-23
          • 1970-01-01
          • 2020-05-31
          • 2011-06-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多