我有一个简单的脚本,它接受一个CSV文件并将每一行读入一个数组.然后,我循环遍历第一行的每一列(在我的情况下,它包含调查问题)并打印出来.调查是法语的,每当问题的第一个字符是特殊字符(é,ê,ç等)时,fgetcsv就会省略它.
值的中间的特殊字符仅在它们是第一个字符时才受影响.
我试着调试这个,但我很困惑.我做了一个var_dump与文件的内容,字符肯定在那里:
var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
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 />";
}
}
Run Code Online (Sandbox Code Playgroud)
您在呼叫之前是否正确设置了区域设置fgetcsv()?
setlocale(LC_ALL, 'fr_FR.UTF-8');
Run Code Online (Sandbox Code Playgroud)
否则,fgetcsv()不是多字节安全的.
确保将其设置为可用语言环境列表中显示的内容.在linux上(当然在debian上)你可以看到这一点
locale -a
Run Code Online (Sandbox Code Playgroud)
你应该得到像......
C
en_US.utf8
POSIX
Run Code Online (Sandbox Code Playgroud)
对于UTF8支持,最后选择utf8编码.如果您的输入是用其他东西编码的,则需要使用适当的语言环境 - 但请确保您的操作系统首先支持它.
如果将区域设置设置为系统上不可用的区域设置,则无法帮助您.
您已经查看过fgetcsv 的手册页了吗?没有立即谈论这个具体问题,但如果这里没有任何内容,那么许多贡献可能值得一看。
有这样的,例如:
注意:此函数会考虑区域设置。如果 LANG 是例如 en_US.UTF-8,则该函数会错误地读取一字节编码的文件。
另外,由于它总是位于行的开头,这是否真的是一个隐藏的换行问题?有这个:
注意:如果 PHP 在读取 Macintosh 计算机上的文件或由 Macintosh 计算机创建的文件时无法正确识别行结尾,则启用 auto_detect_line_endings 运行时配置选项可能有助于解决该问题。
您可能还想尝试使用不同的行结尾保存文件。