3

私はこれが何度か議論されてきたことを知っていますが、それでも私はこの問題に夢中になっています. submit.php アクションを含むフォームがあります。最初は、文字セットについては何も変更せず、utf8 ヘッダー情報も使用しませんでした。その結果、データベース内のすべての ä、ö、ü などを正しく読み取ることができました。それらをExcelにエクスポートし.csvてExcelにインポートするとUTF-8 charset(他のすべてもテストされました)、文字セットが正しくなくなります。

今私が試したこと:

PHP:

header("Content-Type: text/html; charset=utf-8");
$mysqli->set_charset("utf8");

MySQL: データベースを削除して、新しいデータベースを作成しました:

create database db CHARACTER SET utf8 COLLATE utf8_general_ci;
create table ...

my.cnf を変更し、SQL サーバーを再起動しました。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[mysql]
default-character-set=utf8

bash 経由でデータベースに接続すると、次の出力が表示されます。

| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |

PHP テスト:

var_dump($mysqli->get_charset());

私に与える:

Current character set: utf8 object(stdClass)#3 (8) { ["charset"]=> string(4) "utf8"     ["collation"]=> string(15) "utf8_general_ci" ["dir"]=> string(0) "" ["min_length"]=> int(1) ["max_length"]=> int(3) ["number"]=> int(33) ["state"]=> int(1) ["comment"]=> string(13) "UTF-8 Unicode" }

今私は使用します:

mysql -uroot -ppw db < require.sql > /tmp/test.csv

require.sql は単に

select * from table;

また、UTF-8などを選択しても、csvとしてExcelにインポートできません。それはいつも私にいくつかの暗号を与えています..

うまくいけば、誰かがここで何がうまくいかなかったのかヒントを得ました..

乾杯

E: TextMate は私に正しい出力を与えているので、変換が実際に機能しているように見えますが、それは Excel の問題ですか? マイクロソフト オフィス 2011 を使用しています。

E2: latin1 でも同じことを試しました - 同じ問題で、特殊文字を壊さずに Excel にインポートできません。ヒントや回避策はありますか?

E3: Excel のインポート機能では機能するが、.csv のダブルクリックでは機能しない回避策を見つけました。

    iconv -f utf8 -t ISO-8859-1 test.csv > test_ISO.csv

これで、Windows (ANSI) を使用して csv を Excel にインポートできるようになりました。ダブルクリックの代わりにこの機能を使わなければならないのはまだ面倒です。また、インポート機能、BOM の追加、UTF8 の完全なデータベースを使用しても、UTF8 が機能しない理由がわかりません。

カンマ区切りもめちゃくちゃであることが判明しました。1. Concat_WS は、愚かな concat_ws(..) ヘッダーを .csv ファイルに追加しているため、部分的にしか機能しません。また、「file test.csv」では「カンマ区切り」が表示されません。これは、すべてがコンマで区切られていても、Excel はダブルクリックしても認識しないことを意味します。2. sed/awk: いくつかのコード スニペットが見つかりましたが、それらのすべてがテーブルをひどく分離していました。たとえば、列通りの「通り名番号」は、1 つの列から 2 つの列を作成する「通り名」、「番号」のままで、テーブルが台無しになりました。

したがって、Excelはダブルクリックでのみ.csvを開くことができるようです。a)ISO-8859-1でエンコードされています(標準のmac文字セットはMacintoshであるため、Windowsの下でのみ)b)属性「カンマ区切り」を持つファイル。これは、Excel 自体を使用して .csv を作成すると、次の出力が得られることを意味します。

file test1.csv

だろう

test1.csv: ISO-8859 text, with CRLF line terminators

コンマを追加するために使用されるRegExでiconv変更された文字セットは次のようになります。

test1.csv: ISO-8859 text

かなり奇妙な動作 - 誰かが実用的な解決策を得たのかもしれません。

4

2 に答える 2

0

これが、utf-8 mysql テーブルから取得したデータを保存する方法です。最初に BOM を追加する必要があります。例:

<?php
$fp = fopen(dirname(__FILE__).'/'.$filename, 'wb'); 
fputs($fp, "\xEF\xBB\xBF"); 
fputcsv($fp, array($utfstr_1,$utfstr_2);
fclose($fp);

また、MySQL に UTF-8 を使用することも伝えてください。

mysql_query("SET CHARACTER SET utf8"); 
mysql_query("SET NAMES utf8"); 

データを選択する前に、これを実行する必要があります。

ロケールを設定すれば、Proapply は悪くありません:setlocale(LC_ALL, "en_US.UTF-8");

それが役に立てば幸い。

于 2013-01-29T13:43:54.047 に答える
0

助けてくれてありがとう、私はついに機能するようになりました-ダブルクリック可能なcsvファイルが開き、文字が正しく表示されます。優れたワークフローに関心のある方は、こちらをご覧ください。

1.) 私のデータベースは完全に UTF8 を使用しています。2.) PHP 経由でフォームをデータベースにエクスポートします。私はmysqliをヘッダー情報として使用しています:

header("Content-Type: text/html; charset=ISO-8859");

これにより、データベース内のすべてが見栄えが悪くなります。utf8を使用して正しく見えるようにしてください。ただし、私の場合は問題ありません。

3.) 以前に作成された .csv ファイルを削除する cron デーモンによって実行されるスクリプトを作成しました。

rm -f path/to/csv ##I have 3 due to some renaming see below

b) mysql を使用して新しい csv を作成する (これはまだ UTF8 です)

mysql -hSERVERIP -uUSER -pPASS DBNAME -e "select * from DBTABLE;" > PATH/TO/output.csv

これで、.csv で区切られたタブができました。(PHP から UTF8 でエクスポートした場合) OpenOffice などでは正しく表示されますが、Excel では正しく表示されません。UTF8 としてのインポートでさえ機能しません。

c) ファイルをセミコロン区切りにする (Excel 標準、コンマ区切りファイルをダブルクリックしても、少なくともヨーロッパ版の Excel では機能しません)。小さな python スクリプト semicolon.py を使用しました。

import sys
import csv

tabin = csv.reader(sys.stdin, dialect=csv.excel_tab)
commaout = csv.writer(sys.stdout, delimiter=";")
for row in tabin:
  commaout.writerow(row)

d) ここで、cron sh ファイル内でスクリプトを呼び出す必要がありました。

/usr/bin/python PATH/TO/semicolon.py < output.csv > output_semi.csv

スクリプトを cron として使用する場合は、必ずすべてのファイルのフル パスを使用してください。

e) iconv を使用して、文字セットを UTF8 から ISO-8859-1 (Windows ANSI Excel 標準) に変更します。

iconv -f utf8 -t ISO-8859-1 output_semi.csv > output_final.csv

以上です。csv は、Mac/Windows Excel 2010 (テスト済み) でダブルクリックすると開きます。

おそらく、これは同様の問題を抱えている人の助けになるでしょう。それは私を夢中にさせました。

編集: 一部のサーバーでは、データベースからの出力が既に ISO8859 であるため、iconv は必要ありません。mysql コマンドを実行した後、csv を確認する必要があります。

file output.csv

文字セットが iso8859-1 でない場合にのみ iconv を使用する

于 2013-02-05T12:34:08.827 に答える