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

Enr*_*iqe 4 php unicode file-io

我在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 çæ¤ææ¬çææ¸ææ°ã
Run Code Online (Sandbox Code Playgroud)

有什么好主意吗?我检查了价值,count($lines)这是完全正确的...谢谢.

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

hak*_*kre 9

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

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

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

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

然后逐行从缓冲区中分割出来(如果文件用完字节,则再次从文件中重新填充缓冲区)然后你可以iconv按照手册页中的说明使用(或者你的问题,你所拥有的示例代码不是错了,只要注意你使用正确的参数,这样编码是正确的).


Dub*_*bbo 5

以下代码对我有用:

只需使用以下函数 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);
} 
?>
Run Code Online (Sandbox Code Playgroud)

从这个网站