在laravel中读取CSV文件时发出UTF-8,二进制数据和特殊字符

问题描述 投票:1回答:2

我正在使用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中的文本以保存在数据库中,因为复制粘贴文本和特殊字符在大多数情况下都不起作用。

谢谢。

php laravel csv fgetcsv utf8mb4
2个回答
0
投票

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


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:º而不是º

© www.soinside.com 2019 - 2024. All rights reserved.