CSV导入过程中的特殊字符编码

3

我有一个脚本,可以读取*.CSV文件,然后将其内容导出到MSSQL数据库。脚本只能通过CLI运行。

我的问题是这个CSV文件包含了一些带有国际字符的字符串,比如ą,ó,ż,ź,ś。例如,我有一个单词pracowników,但是在CLI中,我看到的是pracownikˇw

我的代码

$handler = fopen($file, "r");
        if ($handler !== false) {
            while (($this->currentRow = fgetcsv($handler, 0, $this->csvDelimiter)) !== false) {

                $row = $this->setHeaders(
                    $this->currentRow,
                    $this->config[$type]['columnMapping']
                );

                if ($row !== false) {
                    $this->dataImported[$type][] = $row;
                }
            }

            fclose($handler);
        }

我尝试过的方法

  • 使用fgetcsvsetlocale或不使用-无效。
  • fgetcsv替换为fgets,并通过str_getcsv读取每行-无效。
  • 对于每一行使用utf8_encode-无效。

附加信息

  • 根据我的PHP(PHP5.3)和一些编辑器,此文件编码为ANSII,我尝试使用iconv解码,但所有特殊字符总是被一些奇怪的符号替换,如之前所示。

不需要的转换到底是在哪里发生的,读取时还是插入时?我希望它发生在插入数据库时... - Jakumi
@Jakumi,不需要的转换发生在文件读取之后。 - PoorDeveloper
为了在CLI中正确读取它,请使用chcp更改区域设置为支持这些字符的区域设置,但请记住它对Unicode的支持非常有限。然而,也许问题是您需要设置正确的合作和数据库的编码,以便其他应用程序也可以正常读取它。 - Xorifelse
@Xorifelse 这个问题在插入数据库表后也出现了。无论我在哪里检查这个词,它总是有奇怪的符号代替国际字符。另一方面,如果我通过正常的HTML表单向数据库添加内容,则所有字符都会被正确保存。 - PoorDeveloper
在Notepad++或其他编辑器中打开文件,将其另存为UTF-8格式,然后再尝试。 - Xorifelse
@Xorifelse 问题仍然存在,只是国家字符的奇怪符号已经改变了 ;) - PoorDeveloper
1个回答

1
在循环$this->currentRow时,尝试使用具有特殊字符的每个元素。
echo mb_convert_encoding($data[$c],"HTML-ENTITIES","UTF-8");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接