如何使用unicode charset将xls / csv文件导入php / mysql?

时间:2009-05-21 21:17:01

标签: php mysql excel unicode

我想让用户能够将csv文件导入到我的php / mysql系统中,但是当语言是俄语时,遇到了一些编码问题,而excel只能存储在UTF-16标签编码标签文件中。

现在我的数据库在latin1中,但我会将其更改为utf-8,如问题“a-script-to-change-all-tables-and-fields-to-the-utf-8-bin”所述-collat​​ion合MySQL的“

但是我应该如何导入文件?并存储字符串?

我应该将其翻译为html_entitites吗?

我正在使用fgetcsv命令从csv文件中获取数据。 我的代码现在看起来像这样。


file_put_contents($tmpfile, str_replace("\t", ";", file_get_contents($tmpfile)));
$filehandle = fopen($tmpfile,'r');
while (($data = fgetcsv($filehandle, 1000, ";")) !== FALSE) {
  $values[] = array(
    'id' => $data[0], 
    'type' => $data[1], 
    'text' => $data[4], 
    'desc' => $data[5], 
    'pdf' => $data[7]);
}

请注意,如果我将xls文件作为csv存储在excel中,我将特殊字符替换为'_',因此我可以从文件中获取俄语字符的唯一方法是将文件存储在excel中标签分隔文件,采用UTF16格式。

5 个答案:

答案 0 :(得分:2)

好的,解决方案是将文件从excel导出为UTF16 unicode文本并添加';' '\ t'的instaid并从utf16转换为utf8。

file_put_contents($tmpfile, str_replace("\t", ";",  iconv('UTF-16', 'UTF-8', file_get_contents($tmpfile))));

mysql中的表必须从latin1更改为utf8

ALTER TABLE  `translation` 
CHANGE  `text`  `text` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE  `desc`  `desc` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

然后可以像以前一样导入文件。

当我想将数据从数据库导出到excel文件时,csv-version是不是的选项。它必须在excel的html模式下完成。数据通过例如更正的地方。 urlencode()htmlentities()

这里有一些示例代码。


<?php
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="export.xls"');
print ('<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<div id="Classeur1_16681" align=center x:publishsource="Excel">
<table x:str border=0 cellpadding=0 cellspacing=0 width=100% style="border-collapse: collapse">');
for($i = 0 ; $i < count($lines) ; $i++) {
    print ('<tr><td>');
  print implode("</td><td>",$lines[$i]);
    print ('</td></tr>');
}
?>
</div>
</body>
</html>

答案 1 :(得分:0)

或者你可以使用MySQL load command。此命令允许您指定分隔符,字符集等。需要注意的是,加载数据的服务器必须具有文件的直接可见性,这意味着该文件必须驻留在数据库服务器可见和可读的文件系统上。

答案 2 :(得分:0)

我不会使用PHP导入它。而是考虑使用READ DATA INFILE创建临时表来存储数据。

$file_handle = fopen($file_name, 'r');
$first_row = fgetcsv($file_handle, 0, ',', '"');
fclose($file_handle);
# Your usual error checking
if (!is_array($first_row)) {
    ...
}
$columns = 'column'.implode(' TEXT, column', array_keys($first_row)).' TEXT';
query("CREATE TABLE $table ($columns) Engine=MyISAM DEFAULT CHARSET=ucs2");
query("LOAD DATA LOCAL INFILE '$file_name' INTO TABLE $table ...

然后,您可以使用该表中的数据执行任何操作。

答案 3 :(得分:0)

好的,我的解决方案 ALSO 将文件从excel导出为UTF16 unicode文本。唯一的区别是我使用制表符分隔符获取文件:

fgetcsv($fp, '999999', "\t", '"')

答案 4 :(得分:0)

我尝试了很多替代方案,但最简单快速的解决方案是使用 Navicat

http://www.navicat.com/

enter image description here