Php 几乎相同的代码,但不同的输出,为什么?
我正在处理UTF-8编码的文本文件,但找不到合适的解决方案 在我无法解决字符串问题后,我现在尝试fgetc(),但它也不起作用。 此代码: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”,它将不工作,它将输出:� � �
$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";
}