2

UTF-8 でエンコードされたテキスト ファイルを使用していますが、適切な解決策が見つかりません...

文字列の問題が解決できなかったので、現在 fgetc() を試していますが、これも機能しません。このコード:

$file = fopen("t1.txt","r+");
while (! feof ($file))
{
  $c= fgetc($file);
  echo $c;
  //echo "\t";
}
fclose($file);

正常に動作し、出力: abcd абвڛ efg しかし、//echo "\t" のコメントを外すと、動作せず、次のように出力されます: � � abcd � � � � � � efg

なぜ?それを修正する方法は?

4

2 に答える 2

3

一度にファイルバイトを読み取っています。

たとえば、文字はUTF-8 のбバイトとしてエンコードされます。0xD0 0xB1タブ文字は0x09.

したがって、タブ文字がない場合は、最初に0xD0、次にを記述し0xB1、結果として0xD0 0xB1有効な UTF-8 になります。

タブ文字を使用して0x09、すべてのバイトの間に書き込みます-それを作成します: 0xD0 0x09 0xB1. 0xD0に続く0x09は有効な UTF-8 ではないため、ブラウザは置換文字をレンダリングして処理します。

それについてもっと洗練する必要があります。これはうまくいくはずです:

$file = fopen("t1.txt","r+");
while (! feof ($file))
{
  $c = fgetc($file);
  $val = ord($c);

  //UTF-8 Lead Byte
  if( $val & 0x80 ) {
    $continuationByteCount = 0;
    if( ($val & 0xF8) == 0xF0) $continuationByteCount = 3;
    else if( ($val & 0xF0) == 0xE0) $continuationByteCount = 2;
    else if( ($val & 0xE0) == 0xC0) $continuationByteCount = 1;

    echo $c;

    while( $continuationByteCount-- ) {
        echo fgetc($file);
    }

  }
  else { //Single-byte UTF-8 unit... I.E. ASCII
      echo $c;
  }
  echo "\t";
}

fclose($file);

すべてを一度に読み取り、各項目が 1 文字 (1 ~ 4 バイト) の配列に分割します。

$chars = preg_split( '//u', file_get_contents("t1.txt"), -1, PREG_SPLIT_NO_EMPTY );

foreach( $chars as $char ) {
    echo $char;
    echo "\t";
}
于 2013-02-05T14:54:45.793 に答える
0

これは、ブラウザからのエンコード認識に問題があるのではないかと思います。あなたが試すことができます

<?php
header('Content-type: text/html; charset=utf-8');
?>

またはメタタグを設定します

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
于 2013-02-05T13:30:10.537 に答える