您一次读取文件字节。
例如,字符б
编码为0xD0 0xB1
UTF-8 中的字节。制表符是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";
}