在Laravel中读取CSV文件时出现UTF-8,二进制数据和特殊字符问题

时间:2019-04-29 22:41:34

标签: php laravel csv fgetcsv utf8mb4

我正在使用League / CSV Laravel软件包读取和操作CSV文件并将该CSV数据保存到数据库中,但是我仅在某些行中遇到一些问题,该行在从CSV读取数据时具有一些特殊字符,例如“ 45.6ºF”

我对此问题进行了大量搜索,发现我们应该在数据库排序规则中使用“ UTF-8”或“ utf8mb4”,并将该CSV保存在“ utf8”中,但它仅适用于所有那些特殊字符在键盘上。

我想使用键盘上也没有的所有特殊字符,例如“ 45.6ºF”。

当前,我的代码正在读取CSV列数据并将其转换为二进制数据' b"column value" ',它将"b"与字符串相加,并且仅将那些具有任何特殊字符的字符串转换为二进制值。

我花了很多时间,但是找不到解决此问题的更好方法。所以请帮助我,我将非常感谢您。

 $reader = Reader::createFromPath(public_path().'/question.csv', 'r');
 $reader->setHeaderOffset(0);
 $records = $reader->getRecords();
 foreach ($records as $offset => $record) {
    $qs = Question::first();
    $qs->question =  $record['Question'];
    $qs->save();
 }

从CSV中读取带有“ b”的内容后,结果就是这样。

array:2 [▼
  "ID" => "1"
  "Question" => b"Fahrenheit to Celsius (ºF to ºC) conversion calculator for temperature conversions with additional tables and formulas"
]

但是它应该是字符串格式,没有二进制“ b”。

如果我复制带有特殊字符的字符串并将其分配给静态变量,则它可以正常工作并将数据保存到这样的数据库中

$a="Fahrenheit to Celsius (ºF to ºC) conversion calculator for temperature conversions with additional tables and formulas";

$qs = Question::first();
$qs->question =  $a;
$qs->save();

经过很多努力,我找到了解决这个问题的方法。 我只是将此行添加到代码中,然后在保存到数据库之前将其转换为 utf8_encode

$r = array_map("utf8_encode", $record);

因为复制粘贴文本和特殊字符在大多数情况下不起作用,所以不要仅仅复制Google粘贴文本以保存到数据库中。

谢谢。

2 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法。下面的代码行解决了我的问题$r = array_map("utf8_encode", $record);在保存到数据库之前,我们只需要转换为 utf8_encode

答案 1 :(得分:0)

请勿使用任何转换例程;只会导致“两个错误无意中造就了权利”。

有了MySQL的LOAD DATA INFILE,您甚至需要fgetcsv吗?只需使用命令中指定的适当字符集执行LOAD SQL命令。该值应与csv文件的编码匹配。如有疑问,请尝试从文件中获取º 的十六进制

hex BA   --> character set latin1
hex C2BA --> character set utf8 (or utf8mb4)

数据库表中的列可以是latin1或utf8或utf8mb4。如果需要,转换将在LOAD期间进行。

度数符号是两个字符集中都存在的少数几个特殊字符之一,因此,如果您还有其他字符,latin1可能不是一个可行的选择。 (utf8 / utf8mb4还有很多特殊字符。)

b"..."的当前用法可能是通过将C2BA拖入latin1列而使情况变得更糟,导致出现Mojibake:º而不是º