1

我有一个需要上传到数据库的 .csv 文件。已经有一个现有的 PHP 脚本,它解析该数据并将其插入到几个数据库表中,并且运行良好。最新的 csv 文件给了我错误。

我不能让自己解决这个问题。这是没有特殊字符的简单英文文本,但我在某些行上不断出错。

这是一个这样的行的示例

这是一种旨在平衡风险和回报的投资策略

这是我上传时遇到的错误

ERROR=1366 - 不正确的字符串值:第 1 行的列 'question' 的 '\xA0strat...'

表字符集为 UTF-8,列 question 为 TEXT 类型

我在 Windows 命令提示符下运行 PHP 脚本 - 我感觉它与此有关。但在以前的所有情况下,对于其他 CSV 文件 - php 脚本都在 Windows 本身上运行。

现在,当我在记事本中键入上述英文文本并将其插入 CSV 文件时 - 它工作正常 - 但我有超过 500 行出现此错误,我无法继续在记事本中输入每一行,然后将其粘贴到 CSV 中。

***编辑** * ** * *** 这是产生错误的代码

foreach($question_array 作为 $question)
{
   //插入问题表
   mysql_query("INSERT INTO adl_question (question) VALUES ('".$question."')",$con);
   echo 'ERROR='.mysql_errno($con).'-'.mysql_error($con);
   $question_id = mysql_insert_id();
}

任何见解谢谢

4

2 回答 2

3

我最近在进行数据转换时遇到了这个问题。您需要做的是使用 iconv 将其显式读取为 WINDOWS-1250(或任何编码“坏”文本的字符),然后转换回 UTF-8。

<?php 
$string = iconv('windows-1250', 'utf-8', $badString);
?>

有关详细信息,请参阅http://us3.php.net/manual/en/function.iconv.php

如果您需要对整个文件执行此操作,可以使用此函数(我没有编写):

<?php 
function utf8_fopen_read($fileName) {
    $fc = iconv('windows-1250', 'utf-8', file_get_contents($fileName));
    $handle=fopen("php://memory", "rw");
    fwrite($handle, $fc);
    fseek($handle, 0);
    return $handle;
}
?>

然后像这样实现它:

<?php 
if (($handle = utf8_fopen_read("mycsv.csv")) !== FALSE) {

    while($file = fgetcsv($handle)) {
        $csv[] = $file;
    }

    foreach($csv as $row) {
        // run insert here
    }
}
?>
于 2012-07-23T14:21:51.873 回答
0

错误字符串表明文本中有非 ascii 字符。例如,char \xA0 在大多数编辑器中将显示为空白,但超出了 ascii 范围。在您的示例中,在“策略”一词之前必须有这些字符之一。

一个好的十六进制编辑器会告诉你字符串中的实际字符是什么。我使用notepad++查看麻烦的文本,你必须启用特殊的字符查看。

于 2012-07-23T14:22:22.960 回答