4

Excel 2010 Professional Plus を使用して Excel ファイルを作成しています。後で、UTF-8 .csv ファイルとしてエクスポートしようとしています。私はそれをCSVとして保存することでこれを行います(記号で区切られています.....正確な言葉遣いはわかりませんが、英語版がなく、 1:1 とは異なる方法で翻訳されているのではないかと心配しています)。そこで、tools->weboptions をクリックし、エンコードとして Unicode (UTF-8) を選択します。.csv の例は次のとおりです。

ID;englishName;germanName
1;Austria;Österreich

ここまでは順調ですが、php コードでファイルを開くと、次のようになります。

 header('Content-Type: text/html; charset=UTF-8');
 iconv_set_encoding("internal_encoding", "UTF-8");
 iconv_set_encoding("output_encoding", "UTF-8");
 setlocale(LC_ALL, 'de_DE.utf8');
 $fp=fopen($filePathName,'r');
 while (($dataRow= fgetcsv($fp,0,";",'"') )!==FALSE)
 {
     print_r($dataRow);
 }
  • 結果として、画面に「sterreich」が表示されます (これは「エラー」であるため、結果の他のすべての部分を切り取りました)。
  • notepad++ でファイルを開いてエンコーディングを見ると、UTF-8 ではなく "ANSI" が表示されます。
  • notepad++ のエンコーディングを UTF8 に変更すると....ö、ä、... が特殊な文字に置き換えられるため、手動で修正する必要があります。

別のルートに進み、notepad++ で新しい UTF-8 ファイルを作成し、Excel ファイルと同じデータを入力すると、php ファイルで開くと画面に「Österreich」と表示されます。

今私が持っている質問は、なぜExcelで機能しないので、ここで何か間違ったことをしているのですか? それとも私は何かを見落としていますか?

編集: プログラムは最終的に顧客が提供するWindowsサーバーにインストールされるため、追加のツールをインストールする必要がないソリューションが必要です(phpライブラリなどは問題ありませんが、vm-wareまたはcygwin ではありません)。また、顧客はファイル アップロード ダイアログを介して .csv ファイルをアップロードできるため、サーバーにローカルにインストールされた Excel (または Office) はありません (ダイアログ自体は問題の一部ではありません。それらを処理し、さらに、Excel ファイルを作成し、Excel がローカルにインストールされているテストマシンで .csv に変換したときにつまずいた問題自体を処理します)。

TNX

4

5 に答える 5

11

PHPドキュメントから

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

あなたが試すことができます

header('Content-Type: text/html; charset=UTF-8');
$fp = fopen("log.txt", "r");
echo "<pre>";
while ( ($dataRow = fgetcsv($fp, 1000, ";")) !== FALSE ) {
    $dataRow = array_map("utf8_encode", $dataRow);
    print_r($dataRow);
}

出力

Array
(
    [0] => ID
    [1] => englishName
    [2] => germanName
)
Array
(
    [0] => 1
    [1] => Austria
    [2] => Österreich
)
于 2012-11-10T18:40:32.867 に答える
1

Excel が UTF-8 ではなく ANSI ファイルを生成する理由はわかりませんが (Notepad++ でわかるように)、その場合は、iconv を使用してファイルを変換できます。

iconv --from-code=ISO-8859-1 --to-code=UTF-8 my_csv_file.csv > my_csv_file_utf8.csv

于 2012-11-07T10:36:34.527 に答える
1

そしてチェコ共和国の人々のために:

function convert( $str ) {
    return iconv( "CP1250", "UTF-8", $str );
}
...
while (($data = fgetcsv($this->fhandle, 1000, ";")) !== FALSE) {
$data = array_map( "convert", $data );
...
于 2013-11-28T14:53:22.087 に答える
0

問題はファイルのエンコーディングにあるに違いありません。utf-8 ではないようです。

あなたの例と実際にutf-8であるダブルチェックファイルを試したところ、うまくいきました。

配列 ( [0] => 1 [1] => オーストリア [2] => Österreich )

LibreOffice (OpenOffice) を使用すると、この種の作業に対してより信頼性が高くなります。

于 2012-11-11T12:12:15.030 に答える
0

あなたの言うことから、私は Excel がBOM なしで UTF-8 ファイルを書き込んでいると思われます。Format->Encode in UTF-8 (without BOM)(ではなく)を押したときに Notepad++ で文字が正しく表示される場合は、この診断を確認できますFormat->Convert to UTF-8 (without BOM)

また、すべてのユーザーが UTF-8 を使用すると確信していますか? 実際の入力エンコーディングが何であるかを少し賢く推測する何かが必要だと私には思えます。「スマート」とは、この推測が BOM なしの UTF-8 を認識することを意味します。

追いかけるために、私はそのようなことをします:

$f = fopen('file.csv', 'r');

while( ($row = fgets($f)) != null )
    if( mb_detect_encoding($row, 'UTF-8', true) !== false )
        var_dump(str_getcsv( $row, ';' ));
    else
        var_dump(str_getcsv( utf8_encode($row), ';' ));

fclose($f);

最初の3文字を怠惰に信頼するのではなく、文字を読み取ってエンコーディングを推測するため、これは機能します。したがって、BOMのないUTF-8は引き続きUTF-8として認識されます。もちろん、csvファイルが大きすぎない場合は、ファイルの内容全体でそのエンコーディング検出を行うことができます:mb_detect_encoding(file_get_contents(...), ...)

于 2012-11-11T11:44:33.543 に答える