5

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)、完全に正しいです...ありがとうございます。

編集:
OKなので、iconv("UTF-16", "UTF-8", $lines[$i]);
私も試しましたがiconv("UTF-16LE", "UTF-8", $lines[$i]);
、それでも成功しません...

4

3 に答える 3

13

PHPのfile関数は、UTF-16LEエンコーディングのファイルを読み取ることができません。行末文字で分割する必要がありますが、PHPはここではシングルバイトシーケンスのみをサポートします。UTF-16LEはマルチバイト可変長エンコードであり、file関数にエンコードされた行分割手順と互換性がありません。

そのため、ジョブに間違った関数を使用しています。その単純な答えです。iconvここでの問題ではありませんが、を使用するだけfileです。

代わりに、ファイルをバッファに読み込み、バッファから次々に行を取得して、UTF-8に再エンコードする必要があります。

それは、そのファイルで使用されている行区切り文字について学習することから始まります。PHPのファイル関数(および文字列関数と文字列自体)はバイナリベースであるため、文字列の形式のバイナリシーケンスと、それを見つけるためのstrpos関数を使用します。

次に、バッファから1行ずつ分割し(バイトが不足した場合はファイルからバッファを再入力します)iconv、マニュアルページで概説されているように使用できます(または質問、あなたが持っているサンプルコードは見ていません間違っています。エンコーディングが正しくなるように、正しいパラメータを使用するように注意してください)。

于 2013-02-26T22:42:14.150 に答える
6

次のコードは私のために働きます:

fopenの代わりに次の関数fopen_utf8を使用するだけです。

<?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);
} 
?>

このウェブサイトから

于 2017-08-22T00:22:20.403 に答える
-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);    
}
于 2014-07-21T08:39:14.693 に答える