php - 在 laravel 中读取 CSV 文件时出现 UTF-8、二进制数据和特殊字符问题
问题描述
我正在使用 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();
}
从带有“b”的 CSV 读取后,它给了我这个结果。
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);
不要只是从谷歌复制粘贴文本以保存在数据库中,因为复制粘贴文本和特殊字符在大多数情况下都不起作用。
谢谢。
解决方案
我找到了解决这个问题的方法。下面的代码行解决了我的问题$r = array_map("utf8_encode", $record)
;我们只需要在保存到数据库之前转换成utf8_encode 。
推荐阅读
- r - 如何制作对列中特定类别有条件要求的子集?
- excel - 如何使用 VBA 在列中插入组上方/下方的行
- excel - 在表之间复制列复制目标中的第一个单元格,而不是复制列
- c# - 根据集合的每个元素中的字段来保持单个 UI 元素更新的高效方法是什么?
- sqlite - 如何将图像存储在 sqlite 中?
- angularjs - 如果它不是日期对象,如何更新 datepicker 的 ng-model?
- ruby-on-rails - 如何在导入期间向 Ruby on Rails 模型添加临时属性
- javascript - 如何使用 JavaScript 或 Jquery 选择 GridView 中选定的行项的子项?
- ecmascript-6 - 使用 Nuxt.js 强制 WebStorm 在导入中具有绝对路径
- azureservicebus - Mass Transit - 在 Web 应用程序中生成消息并在 Azure 函数中使用