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]);
但仍然没有成功......
PHP的file功能无法读取UTF-16LE编码的文件.它需要拆分行结束字符,但PHP只支持单字节序列,UTF-16LE是一种多字节可变长度编码,与编码到file函数中的行拆分程序不兼容.
所以你使用错误的功能来完成工作.这很简单就是答案.这不是iconv问题,而是使用file.
相反,您需要将文件读入缓冲区,从缓冲区中获取一行,然后重新编码为UTF-8.
首先要了解该文件中使用的行分隔符.由于PHP的文件函数(以及字符串函数以及字符串本身)是基于二进制的,因此采用字符串形式的二进制序列和strpos函数来定位它.
然后逐行从缓冲区中分割出来(如果文件用完字节,则再次从文件中重新填充缓冲区)然后你可以iconv按照手册页中的说明使用(或者你的问题,你所拥有的示例代码不是错了,只要注意你使用正确的参数,这样编码是正确的).
以下代码对我有用:
只需使用以下函数 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)
| 归档时间: |
|
| 查看次数: |
8428 次 |
| 最近记录: |