10

提供された回答はすべて素晴らしいものでした.Alnitakの回答のコメントで、何らかの理由でUTF-8を出力していないため、CSV生成スクリプトを確認する必要があると述べました。

正しく指摘されたように、それは 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 が「£」で終わることに気付きました。

これがどこでどのように発生するのを止めるかはよくわかりません。コードと 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;
}

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 | 
4

7 に答える 7

18

表示されているのはUTF-8エンコーディングです。これは、Unicode文字を比較的コンパクトな形式で格納する方法です。

ポンド記号は0x00a3Unicodeで値を持ちますが、UTF-8で記述されている場合0xc2 0xa3は、データベースに格納されます。データベーステーブルはすでにUTF-8エンコーディングを使用するように設定されているようです。これは良いことです!

値をデータベースから取り出して、UTF-8互換端末(またはUTF-8エンコードされていると宣言されているWebページ)に表示すると、通常のポンド記号のようになります。

于 2008-12-22T14:43:19.757 に答える
8

£は0xC20xA3であり、£記号のUTF-8エンコーディングです。したがって、UTF-8として保存していますが、おそらくラテン1またはUTF-8以外のものとして表示しています。

UTF-8を手動で見つけてデコードする方法を知っておくと便利です。エンコードがどのように機能するかについては、ウィキペディアのページを確認してください。

  • 0xC2A3 = 110 00010 10 100011
  • 太字の部分は実際の「ペイロード」であり、ポンド記号である0xA3である10100011を示します。
于 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

HTMLをutf-8エンコーディングで提供する必要があります(実際には、誰もがこれを行う必要があると思います!)ヘッダーは次のようになります。

コンテンツタイプ:text / html; charset = UTF-8

または同等のもの。ただし、詳細を再確認してください。ブラウザはデフォルトで好きなものを使用できるため、常に文字セットを宣言する必要があります。

于 2008-12-22T15:52:34.623 に答える
1

使用を削除するには:

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

とりわけクレジット: PHPで文字列内のc2a0のすべての出現を削除する方法は?

于 2014-12-03T03:58:11.807 に答える
0

行「The £50,000 Development Challenge」を 2 つの異なるデータ型列、つまり「varchar」と「text」フィールドに保存するとします。

保存する前に、次の関数を使用してシンボルをhtmlの等値に置き換えました。str_replace("£", "£", $title);

テキスト フィールドに保存されている値は £ ですが、varchar では "£" です。

于 2010-08-05T16:00:05.663 に答える
0

どうもありがとう。私は mysql がポンド記号を壊しているのではないかと疑っていました。今私がする必要があるのは、csv レコードが生成された場所で、incov 関数でラップするだけです。これは良い仕事ですが、少なくとも誰かが何をすべきかを正確に示してくれたことを嬉しく思います。以前の「ヘッダー」値と新しい「ヘッダー」値を表示していただき、誠にありがとうございます。とても助かりました。

-マーク

于 2009-07-02T14:40:54.257 に答える