UTF-8, проблема двоичных данных и специальных символов при чтении файла CSV в laravel - PullRequest
1 голос
/ 30 апреля 2019

Я использую пакет League / CSV Laravel для чтения и манипулирования CSV-файлом и сохранения этих CSV-данных в базе данных, но я сталкиваюсь с некоторыми проблемами только для некоторых строк, в которых есть некоторые специальные символы, такие как «45,6 ºF», при чтении данных из CSV.

Я много искал об этой проблеме и обнаружил, что мы должны использовать «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 голосов
/ 18 мая 2019

Не используйте никакие процедуры преобразования;это только приводит к «двум ошибкам, случайно сделавшим правильное».

С существованием 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, что приведет к Мохибаке: º вместо º.

0 голосов
/ 30 апреля 2019

Я нашел решение этой проблемы.ниже строки кода исправлена ​​моя проблема $r = array_map("utf8_encode", $record);Нам просто нужно преобразовать в utf8_encode перед сохранением в базу данных.

...