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

您一次读取文件字节

例如,字符б编码为0xD0 0xB1UTF-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";
}
于 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 回答