使用php创建csv文件时的希伯来语问题

时间:2015-04-11 21:13:15

标签: php csv utf-8 export-to-csv hebrew

我有这段代码:

// 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”,“שדה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”。 另外,我的所有db排序规则都是utf8_general_ci。 在我的其他php文件中,细节很好(来自数据库)。

谢谢。

1 个答案:

答案 0 :(得分: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 BOM:

// 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'));

请参阅以下文章: