我有一个网站,用户可以上传包含一些信息的csv文件,然后我将该信息读取并保存在数据库中。问题是,用户有时会报告他/她上传的信息显示为"奇怪的字符"在浏览器中我已经检查过它并以相同的方式保存在数据库中(使用"奇怪的字符)。所以我要求他/她使用的文件并从我的电脑上传,一切都很顺利。用户从Mac计算机上传,我从Windows计算机上传。该站点的服务器是Windows。
这是用户描述的错误的打印件:
我可以上传相同的csv并且该字符串保持正常。我注意到了#34;奇怪的角色"是url的代码。例如,在打印中,空格被%20替换。但是这个字符串来自一个显然没问题的csv文件。由于我无法重现错误,因此很难理解可能发生的事情。但似乎所有似乎都是Mac-Windows之间的某种编码问题。你有这个问题之王吗?
编辑:
这是处理csv文件的代码:
while ($valor = fgetcsv ($handle, filesize($T2), ";")){
for ($i=0;$i<$conta;$i++){
$cv=$data[$i];
$row[$cv]=trim($valor[$i]);
}
if ($row['Ano']==$sql_Documento['Ano'] && $sql_Documento['NumDocumento']==$row['Numero']){
$count++;
$campos = array();
$campos['IdDocumento'] = $sql_Documento[IdDocumento];
$campos['Sociedade'] = mssql_escape_string($row['Sociedade']); //this is the field that gives me problems
$campos['DocumentoId'] = $sql_Documento[DocumentoId];
$campos['page_dr'] = $row['Pagdr'];
$campos['page_file'] = $row['Pagpdf'];
$DocumentoId = insertNewRecord("DocSoc",$campos);
}
}
mssql_escape_string是这个函数:
function mssql_escape_string($data) {
if ( !isset($data) or empty($data) ) return '';
if ( is_numeric($data) ) return $data;
$non_displayables = array(
'/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[\x00-\x08]/', // 00-08
'/\x0b/', // 11
'/\x0c/', // 12
'/[\x0e-\x1f]/' // 14-31
);
foreach ( $non_displayables as $regex )
$data = preg_replace( $regex, '', $data );
$data = str_replace("'", "''", $data );
return $data;
}