一度にファイルバイトを読み取っています。
たとえば、文字は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";
}