11

CSV ファイルを受け取り、すべての行を配列に読み込む単純なスクリプトがあります。次に、最初の行の各列 (私の場合はアンケートの質問が含まれています) を循環し、それらを印刷します。調査はフランス語で行われ、質問の最初の文字が特殊文字 (é、ê、ç など) である場合は常に、fgetcsv は単純にそれを省略します。

値の中間にある特殊文字は、それらが最初の文字である場合にのみ影響を受けません。

これをデバッグしようとしましたが、困惑しています。私はファイルの内容で var_dump を実行しましたが、文字は間違いなくそこにあります:

var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));

そして、ここに私のコードがあります:

if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
    {
        $csv_arr = array();

        //Populate an array with all the cells of the CSV file
        while(!feof($csv))
        {
            $csv_arr[] = fgetcsv($csv);
        }

        //Close the file, no longer needed
        fclose($csv);

        // This should cycle through the cells of the first row (questions)
        foreach($csv_arr[0] as $question)
        {
            echo utf8_encode($question) . "<br />";
        }

    }
4

4 に答える 4

8

を呼び出す前にロケールを正しく設定していますfgetcsv()か?

setlocale(LC_ALL, 'fr_FR.UTF-8');

それ以外の場合、fgetcsv()マルチバイトセーフではありません。

使用可能なロケールのリストに表示されるものに設定してください。Linux(確かにdebian)では、次のようにしてこれを確認できます

locale -a

次のようなものを取得する必要があります...

C
en_US.utf8
POSIX

UTF8 をサポートするには、最後に utf8 を含むエンコーディングを選択します。入力が別のものでエンコードされている場合は、適切なロケールを使用する必要がありますが、最初に OS がそれをサポートしていることを確認してください。

システムで使用できないロケールにロケールを設定すると、役に立ちません。

于 2010-02-10T17:36:17.200 に答える
2

この動作にはバグ レポートが提出されていますが、明らかにバグではありません

于 2010-08-16T03:43:27.977 に答える
1

fgetcsv のマニュアルページはもうチェックアウトしましたか? その特定の問題について直接話すことは何もありませんが、ここで何も出てこない場合は、多くの貢献を調べる価値があるかもしれません.

たとえば、次のようなものがあります。

注: この関数では、ロケール設定が考慮されます。LANG が例えば en_US.UTF-8 の場合、この関数によって 1 バイト エンコーディングのファイルが正しく読み取られません。

また、常に行の先頭に表示されるので、これは本当に改行の隠蔽の問題なのでしょうか? これがあります:

注: Macintosh コンピューター上または Macintosh コンピューターで作成されたファイルを読み取るときに、PHP が行末を正しく認識しない場合は、auto_detect_line_endings 実行時構成オプションを有効にすると、問題を解決できる場合があります。

別の行末でファイルを保存することもできます。

于 2010-02-10T17:36:01.000 に答える
1

LANGset toで同じ結果が得られCたため、そのような値を引用符で囲むことで回避しました。たとえば、次の行

a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"

を通過すると、次の配列が生成されますfgetcsv()

array (
  0 => 'a',
  1 => 'a',
  2 => '',
  3 => 'é',
  4 => '',
  5 => 'óú',
  6 => '&ú',
  7 => 'ó&ú',
)

もちろん、値の引用符を 2 倍にしてエスケープする必要がありますが、欠落している文字を修復するよりもはるかに手間がかかりません。

奇妙なことに、これは入力ファイルの UTF-8 エンコーディングと cp1252 エンコーディングの両方で発生します。

于 2012-01-26T19:37:52.047 に答える