【问题标题】:UTF-8, binary data and special characters issue while reading CSV file in laravel在 laravel 中读取 CSV 文件时出现 UTF-8、二进制数据和特殊字符问题
【发布时间】:2019-09-18 13:41:43
【问题描述】:

我正在使用 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);

不要只是从谷歌复制粘贴文本以保存在数据库中,因为复制粘贴文本和特殊字符在大多数情况下都不起作用。

谢谢。

【问题讨论】:

  • 是从哪里来的?
  • @RickJames 这个符号没什么特别的,我只是从控制台复制粘贴文本,这个符号显示在 laravel 转储值中。

标签: php laravel csv fgetcsv utf8mb4


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不要使用任何转换程序;只会导致“两错一错”。

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

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 1970-01-01
      • 2012-02-11
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多