如何在PHP中读取unicode文本文件?

时间:2013-02-26 15:20:47

标签: php file-io unicode

我在PHP脚本中读取文本文件(以Unicode UTF16-LE保存)时遇到了一些麻烦。

我的PHP脚本(由于某些原因)以UTF-8保存。

这是我的代码:

$lines = file("./somedir/$filename");

for ($i=0; $i < count($lines); $i++) {
    $lines[$i] = iconv("Unicode", "UTF-8", $lines[$i]); // converting to UTF8
}

echo "[0]:".$lines[0]; // outputs CORRECT text (like "This is the first line")
echo "[1]:".$lines[1]; // outputs something like çæ¤ææ¬çææ¸ææ°ã

请问好吗? 我检查了count($lines)的值,这是完全正确的...... 感谢。

编辑:
好的,所以我尝试了iconv("UTF-16", "UTF-8", $lines[$i]);
我也试过iconv("UTF-16LE", "UTF-8", $lines[$i]);
但仍然没有成功......

3 个答案:

答案 0 :(得分:9)

PHP的file函数无法读取UTF-16LE编码的文件。它需要拆分行结束字符,但PHP只支持单字节序列,UTF-16LE是一种多字节可变长度编码,与编码到file函数中的行分割程序不兼容。 / p>

所以你正在使用错误的功能来完成工作。这很简单就是答案。此处不是iconv问题,而是使用file

相反,您需要将文件读入缓冲区,从缓冲区中取出一行,然后重新编码为UTF-8。

首先要了解该文件中使用的行分隔符。由于PHP的文件函数(以及字符串函数以及字符串本身)是基于二进制的,因此采用string形式的二进制序列和strpos函数来定位它。

然后逐行从缓冲区中拆分(如果文件用完字节,则再次从文件中重新填充缓冲区)然后您可以使用手册页(或您的问题中所述)中列出的iconv您拥有的示例代码看起来不错,只需注意使用正确的参数,以便编码正确)。

答案 1 :(得分:3)

以下代码适用于我:

只需使用以下函数fopen_utf8而不是fopen。

<?php
# http://www.practicalweb.co.uk/blog/2008/05/18/reading-a-unicode-excel-file-in-php/
function fopen_utf8($filename){
    $encoding='';
    $handle = fopen($filename, 'r');
    $bom = fread($handle, 2);
//  fclose($handle);
    rewind($handle);

    if($bom === chr(0xff).chr(0xfe)  || $bom === chr(0xfe).chr(0xff)){
            // UTF16 Byte Order Mark present
            $encoding = 'UTF-16';
    } else {
        $file_sample = fread($handle, 1000) + 'e'; //read first 1000 bytes
        // + e is a workaround for mb_string bug
        rewind($handle);

        $encoding = mb_detect_encoding($file_sample , 'UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP');
    }
    if ($encoding){
        stream_filter_append($handle, 'convert.iconv.'.$encoding.'/UTF-8');
    }
    return  ($handle);
} 
?>

From this website

答案 2 :(得分:-2)

这里是我用来将Unicode转换为普通文本格式的代码。

function ReadUnicodeFile($fn)    
  $fc = "";    
  $fh = fopen($fn,"rb") or die("Cannot open file for read: $fn&lt;br&gt;\n");    
  $flen = filesize($fn);    
  $bc = fread($fh, $flen);

  for ($i=0; $i&lt;$flen; $i++){    
    $c = substr($bc,$i,1);    
    if ((ord($c) != 0) && (ord($c) != 13))    
      $fc = $fc . $c;    
  }

  if ((ord(substr($fc,0,1)) == 255) && (ord(substr($fc,1,1)) == 254))    
    $fc = substr($fc,2);    
  return ($fc);    
}