我在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]);
但仍然没有成功......
答案 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);
}
?>
答案 2 :(得分:-2)
这里是我用来将Unicode转换为普通文本格式的代码。
function ReadUnicodeFile($fn)
$fc = "";
$fh = fopen($fn,"rb") or die("Cannot open file for read: $fn<br>\n");
$flen = filesize($fn);
$bc = fread($fh, $flen);
for ($i=0; $i<$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);
}