包含非英语(希伯来语等)的 CSV 文件
CSV file with non-English (Hebrew etc.)
我有一个可以访问 cPanel 的托管站点,我每天都有一个 cron 作业执行 PHP 脚本。此脚本将 MySQL table 导出到 CSV。然后,我在办公室的 Windows 上安排了一份工作,将此 CSV FTP 发送到我的本地计算机。到目前为止,一切都很好。
但是 MySQL table 中混合了英语和希伯来语数据。通过 cPanel 的文件管理器,我在创建的 CSV 中正确地看到了希伯来语,但是在 FTP 将它发送到我的本地机器之后,希伯来语是不可读的。
编辑:
在 Office-2016 中打开下载的 CSV 文件时,问题仍然存在。使用 Notepad++ 或 MS-Notepad 打开它时 - 希伯来语显示正常。
这意味着文件已正确下载,问题出在 MS-Office。
问题在于,此 CSV 将用作每晚自动运行的 Excel 宏 (XLSM) 的输入。我发现在 Excel 中我可以手动 "Import" 将 CSV 转换为 sheet 并且编码很好,希伯来语也可以。我录制了一个宏,VBA 现在可以很好地完成这项工作。然后我发现它已经在
中提到了
编辑结束
PHP脚本(注意'SET NAMES utf8'):
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$username = "XXX";$password ="YYY";$dbname = "ZZZ";
try {
$conn = new PDO('mysql:host=localhost;dbname='.$dbname, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->query('SET NAMES utf8');
$stmt = $conn->prepare("SELECT comp_id, comp_name FROM companies");
$stmt->execute();
$file_export = '/home/darushnisayon/public_html/vehadarta/Exported_tables_from_DB/AA_companies.csv';
$data = fopen($file_export, 'w');
$csv_fields = array();
$csv_fields[] = 'comp_id';
$csv_fields[] = 'comp_name';
fputcsv($data, $csv_fields);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
fputcsv($data, $row);
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
?>
我的 Windows FTP 作业(注意 BINARY 选项):
@Echo Off
Set _FTPServerName=nn.nn.nnn.nnn
Set _UserName=XXX
Set _Password=YYY
Set _LocalFolder=C:\Dropbox\GADI\Vehadarta\Routine_Tasks\T002_Daily_Check_if_Synced
Set _RemoteFolder=public_html/vehadarta/Exported_tables_from_DB/
Set _Filename=AA_companies.csv
Set _ScriptFile=ftp1
:: Create script
>"%_ScriptFile%" Echo verbose
>>"%_ScriptFile%" Echo open %_FTPServerName%
>>"%_ScriptFile%" Echo %_UserName%
>>"%_ScriptFile%" Echo %_Password%
>>"%_ScriptFile%" Echo lcd %_LocalFolder%
>>"%_ScriptFile%" Echo cd %_RemoteFolder%
>>"%_ScriptFile%" Echo prompt
>>"%_ScriptFile%" Echo binary
>>"%_ScriptFile%" Echo get %_Filename%
>>"%_ScriptFile%" Echo quit
:: Run script
ftp -s:"%_ScriptFile%"
Del "%_ScriptFile%"
在 cPanel 看到的 CSV 文件:
comp_id,comp_name
1,"קשרי עסקים בע""מ"
2,ASK
3,DCL
4,"אסטרטגיה וליווי עסקי S.M.C"
FTP 之后我本地目录中的 CSV 文件:
comp_id comp_name
1 ׳§׳©׳¨׳™ ׳¢׳¡׳§׳™׳ ׳‘׳¢"׳
2 ASK
3 DCL
4 ׳׳¡׳˜׳¨׳˜׳’׳™׳” ׳•׳׳™׳•׳•׳™ ׳¢׳¡׳§׳™ S.M.C
谢谢你的想法。
正如我在 EDIT 中提到的,问题在于 MS-Office 读取 CSV 的方式。在记事本中打开文件时,编码是正确的。由于要将 CSV 复制到 Excel 电子表格中,我所要做的就是将 CSV 'Import' 复制到 Excel.
非常感谢 Martin Prikryl 给了我解决方案的第一个提示。
我有一个可以访问 cPanel 的托管站点,我每天都有一个 cron 作业执行 PHP 脚本。此脚本将 MySQL table 导出到 CSV。然后,我在办公室的 Windows 上安排了一份工作,将此 CSV FTP 发送到我的本地计算机。到目前为止,一切都很好。
但是 MySQL table 中混合了英语和希伯来语数据。通过 cPanel 的文件管理器,我在创建的 CSV 中正确地看到了希伯来语,但是在 FTP 将它发送到我的本地机器之后,希伯来语是不可读的。
编辑:
在 Office-2016 中打开下载的 CSV 文件时,问题仍然存在。使用 Notepad++ 或 MS-Notepad 打开它时 - 希伯来语显示正常。
这意味着文件已正确下载,问题出在 MS-Office。
问题在于,此 CSV 将用作每晚自动运行的 Excel 宏 (XLSM) 的输入。我发现在 Excel 中我可以手动 "Import" 将 CSV 转换为 sheet 并且编码很好,希伯来语也可以。我录制了一个宏,VBA 现在可以很好地完成这项工作。然后我发现它已经在
编辑结束
PHP脚本(注意'SET NAMES utf8'):
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$username = "XXX";$password ="YYY";$dbname = "ZZZ";
try {
$conn = new PDO('mysql:host=localhost;dbname='.$dbname, $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->query('SET NAMES utf8');
$stmt = $conn->prepare("SELECT comp_id, comp_name FROM companies");
$stmt->execute();
$file_export = '/home/darushnisayon/public_html/vehadarta/Exported_tables_from_DB/AA_companies.csv';
$data = fopen($file_export, 'w');
$csv_fields = array();
$csv_fields[] = 'comp_id';
$csv_fields[] = 'comp_name';
fputcsv($data, $csv_fields);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
fputcsv($data, $row);
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
?>
我的 Windows FTP 作业(注意 BINARY 选项):
@Echo Off
Set _FTPServerName=nn.nn.nnn.nnn
Set _UserName=XXX
Set _Password=YYY
Set _LocalFolder=C:\Dropbox\GADI\Vehadarta\Routine_Tasks\T002_Daily_Check_if_Synced
Set _RemoteFolder=public_html/vehadarta/Exported_tables_from_DB/
Set _Filename=AA_companies.csv
Set _ScriptFile=ftp1
:: Create script
>"%_ScriptFile%" Echo verbose
>>"%_ScriptFile%" Echo open %_FTPServerName%
>>"%_ScriptFile%" Echo %_UserName%
>>"%_ScriptFile%" Echo %_Password%
>>"%_ScriptFile%" Echo lcd %_LocalFolder%
>>"%_ScriptFile%" Echo cd %_RemoteFolder%
>>"%_ScriptFile%" Echo prompt
>>"%_ScriptFile%" Echo binary
>>"%_ScriptFile%" Echo get %_Filename%
>>"%_ScriptFile%" Echo quit
:: Run script
ftp -s:"%_ScriptFile%"
Del "%_ScriptFile%"
在 cPanel 看到的 CSV 文件:
comp_id,comp_name
1,"קשרי עסקים בע""מ"
2,ASK
3,DCL
4,"אסטרטגיה וליווי עסקי S.M.C"
FTP 之后我本地目录中的 CSV 文件:
comp_id comp_name
1 ׳§׳©׳¨׳™ ׳¢׳¡׳§׳™׳ ׳‘׳¢"׳
2 ASK
3 DCL
4 ׳׳¡׳˜׳¨׳˜׳’׳™׳” ׳•׳׳™׳•׳•׳™ ׳¢׳¡׳§׳™ S.M.C
谢谢你的想法。
正如我在 EDIT 中提到的,问题在于 MS-Office 读取 CSV 的方式。在记事本中打开文件时,编码是正确的。由于要将 CSV 复制到 Excel 电子表格中,我所要做的就是将 CSV 'Import' 复制到 Excel.
非常感谢 Martin Prikryl 给了我解决方案的第一个提示。