【问题标题】:Howto import xls/csv file with unicode charset into php/mysql?如何将带有 unicode 字符集的 xls/csv 文件导入 php/mysql?
【发布时间】:2010-10-28 01:40:35
【问题描述】:

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

现在我的数据库在 latin1 中,但我会将其更改为 utf-8,如问题“a-script-to-change-all-tables-and-fields-to-the-utf-8-bin”中所述-collat​​ion-in-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 格式的选项卡式分隔文件。

【问题讨论】:

    标签: php mysql excel unicode


    【解决方案1】:

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

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

    mysql中的表要从latin1改成utf8

    ALTER TABLE `翻译`
    更改 `text` `text` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    更改 `desc` `desc` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

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

    当我想将数据库中的数据导出到 excel 文件时,csv 版本是不是的选项。它必须在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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      【解决方案3】:

      我不会使用 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 ...
      

      然后你可以对表中的数据做任何你想做的事情。

      【讨论】:

      • 关于不支持字符集的注释:我实际上会尝试一下,我认为这句话只是意味着在加载数据时无法进行转换。这应该是一个简单的复制操作,将一堆字节转储到列中,应该可以工作
      • 我可以请你看看这个关于相关主题的问题stackoverflow.com/questions/11116963/… 吗?
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        http://www.navicat.com/
        

        【讨论】:

          猜你喜欢
          • 2011-10-05
          • 2017-11-10
          • 1970-01-01
          • 2015-04-29
          • 1970-01-01
          • 1970-01-01
          • 2019-11-20
          • 1970-01-01
          • 2013-08-13
          相关资源
          最近更新 更多