我正在使用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中的文本以保存在数据库中,因为复制粘贴文本和特殊字符在大多数情况下都不起作用。
谢谢。
我找到了解决这个问题的方法。下面的代码行修正了我的问题$r = array_map("utf8_encode", $record)
;我们只需要在保存到数据库之前转换为utf8_encode。
不要使用任何转换程序;它只会导致“两个错误意外地做出正确的”。
随着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:º
而不是º
。