Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 几乎相同的代码,但不同的输出,为什么?_Php_Utf 8_Fgetc - Fatal编程技术网

Php 几乎相同的代码,但不同的输出,为什么?

Php 几乎相同的代码,但不同的输出,为什么?,php,utf-8,fgetc,Php,Utf 8,Fgetc,我正在处理UTF-8编码的文本文件,但找不到合适的解决方案 在我无法解决字符串问题后,我现在尝试fgetc(),但它也不起作用。 此代码: $file = fopen("t1.txt","r+"); while (! feof ($file)) { $c= fgetc($file); echo $c; //echo "\t"; } fclose($file); 工作正常,输出:abcdббқefg 但是如果我取消注释//echo“\t”,它将不工作,它将输出:� � �

我正在处理UTF-8编码的文本文件,但找不到合适的解决方案

在我无法解决字符串问题后,我现在尝试fgetc(),但它也不起作用。 此代码:

$file = fopen("t1.txt","r+");
while (! feof ($file))
{
  $c= fgetc($file);
  echo $c;
  //echo "\t";
}
fclose($file);
工作正常,输出:abcdббқefg 但是如果我取消注释//echo“\t”,它将不工作,它将输出:� � � a、b、c、d� � � � � � � � e f g


为什么??如何修复它?

我认为这可能是浏览器编码识别的问题。你可以试试

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

或者设置元标记

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

您正在一次读取文件字节

例如,字符
б
在UTF-8中编码为字节
0xD0 0xB1
。制表符为
0x09

因此,在没有制表符的情况下,首先写入
0xD0
,然后写入
0xB1
,从而生成有效的UTF-8的
0xD0 0xB1

使用制表符,在每个字节之间写入
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字节):


谢谢,这解决了这个问题,但是我是否可以立即将文件的内容获取为UTF-8,这样我就不需要处理0xF8或其他什么,因为这个文件有很多事情要做。。或者无论如何,我怎样才能正确地将文件内容转换成字符串并通过索引访问它?@hurremdev
$chars = preg_split( '//u', file_get_contents("t1.txt"), -1, PREG_SPLIT_NO_EMPTY );

foreach( $chars as $char ) {
    echo $char;
    echo "\t";
}