FGETCSV()は、ラインの開始時に特殊文字を無視します!
質問
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 />";
}
}
解決
すでにチェックアウトしましたか FGETCSVのマニュアルページ?その特定の問題については何も話していませんが、ここに何も起こらない場合、多くの貢献が調べる価値があるかもしれません。
たとえば、これがあります:
注:この機能により、ロケール設定が考慮されます。 LangがEN_US.UTF-8の場合、1バイトエンコードのファイルがこの関数によって間違って読み取られます。
また、それが常に行の最初にあるのを見ると、これは本当に隠されたラインブレイクの問題である可能性がありますか?これがあります:
注:PHPがMacintoshコンピューターによってファイルを読み取るか作成しているときにラインエンディングを適切に認識していない場合、auto_detect_line_endingsの実行時間構成オプションを有効にすると、問題の解決に役立つ場合があります。
また、異なるラインエンディングでファイルを保存してみることもできます。
他のヒント
電話をかける前に、ロケールを正しく設定していますか fgetcsv()
?
setlocale(LC_ALL, 'fr_FR.UTF-8');
さもないと、 fgetcsv()
マルチバイトは安全ではありません。
利用可能なロケールのリストに表示されるものに設定してください。 Linux(確かにDebianで)でこれを見ることができます
locale -a
あなたは次のようなものを手に入れるべきです...
C
en_US.utf8
POSIX
UTF8のサポートの場合、最後にUTF8を使用してエンコードを選択します。入力が他の何かでエンコードされている場合は、適切なロケールを使用する必要がありますが、最初にOSがサポートされていることを確認してください。
システムで使用できないロケールにロケールを設定しても、それは役に立ちません。
同じ結果が見られました LANG
に設定 C
, 、そして、そのような値が引用符に包まれていることを確認することでそれを回避しました。たとえば、行
a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"
通過したときに次の配列を生成します fgetcsv()
:
array (
0 => 'a',
1 => 'a',
2 => '',
3 => 'é',
4 => '',
5 => 'óú',
6 => '&ú',
7 => 'ó&ú',
)
もちろん、あなたはそれらを2倍にすることで価値の見積マークを逃れる必要がありますが、それは行方不明の文字を修復するよりもはるかに面倒ではありません。
奇妙なことに、これは入力ファイルのUTF-8とCP1252の両方のエンコーディングで発生します。