Проблема с ивритом при создании CSV-файла с помощью переполнения стека

У меня есть этот код:

// output headers so that the file is downloaded rather than displayed
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');

// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');

// output the column headings
fputcsv($output, array('שדה 1', 'שדה 2', 'שדה 3'));

include('config.php');
$id = 2;
$sql = "SELECT name FROM shoes WHERE event_id = '$id'";
$result = mysqli_query($connection,$sql);

// loop over the rows, outputting them
while ($row = mysqli_fetch_assoc($result)) fputcsv($output, $row);

Первая строка в порядке, я получаю «1ה 1», «שדה 2», «שדה 3», но информацию из моей базы данных я получаю так: «׳ Пользователи׳ • ׳¨ ׳‘׳ ׳ – ׳§»

Почему это не на иврите?

Вы можете получить его здесь:
https://eventpay.co.il/1.php

Вот мой конфигурационный файл:

defined('DB_HOST')? null : define('DB_HOST', 'localhost');
defined('DB_USER')?  null : define('DB_USER', '***');
defined('DB_PASS')?  null : define('DB_PASS', '***');
defined('DB_NAME')?  null : define('DB_NAME', '***');

$connection = mysqli_connect(DB_HOST ,DB_USER ,DB_PASS ,DB_NAME);

if (mysqli_connect_errno($connection)){
echo "Failed to connect to MySQL: " . mysqli_connect_error();
die();
}

mysqli_set_charset($connection, "utf8");

Как вы можете видеть, я использовал «mysqli_set_charset».
Кроме того, все мои сопоставления БД — utf8_general_ci.
В моих других файлах php детали в порядке (из БД).

Спасибо.

2

Решение

Я скачал CSV с вашего сайта. Это было очень полезно — если бы все люди делали это, задавая вопросы 🙂

При проверке выяснилось, что первая строка имеет кодировку на иврите / Windows-1255, а вторая строка — на кодировке UTF-8. Посмотрите на файл с помощью достойного текстового редактора, такого как Notepad ++, и попробуйте переключаться между типами кодирования. Шестнадцатеричный редактор подтвердил мое подозрение.

Это означает, что ваш исходный код написан в 8-битной кодировке на иврите, а ваша БД правильно содержит символы UTF-8. Обе строки возвращаются клиенту дословно.

Первая строка выглядит правильно, потому что все, что вы используете для просмотра .csv, также работает в режиме Windows-1255. Я подозреваю, что вы используете Excel, что объясняет результат.

Поскольку вы не можете гарантировать, что все используют кодовую страницу Windows-1255 / иврит, вам лучше сменить исходный код на кодировку UTF-8. Это означает, что символы, не входящие в ASCII, из вашего исходного кода будут выглядеть как UTF-8.

Если вы используете Excel, у вас теперь есть проблема сказать Excel, чтобы он рассматривал файл как UTF-8. Порядок следования байтов UTF-8 решает эту проблему. Это позволяет Excel работать, но имейте в виду — не все текстовые редакторы понимают это.

Чтобы добавить спецификацию UTF-8:

// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');

// UTF-8 BOM
fwrite($output, "\xEF\xBB\xBF");

// output the column headings
fputcsv($output, array('שדה 1', 'שדה 2', 'שדה 3'));

Смотрите следующие статьи:

2

Другие решения

Других решений пока нет …