为 fread fwrite 设置 utf-8 编码

6

你好,我使用这段代码来读写文件中的文本。

$d = fopen("chat.txt", "r");
 $content=fread($d,filesize('chat.txt'));
 $bn=explode('||',$content);
 foreach($bn as $bn)
 echo $bn.'<br>';

并且

$d = fopen("chat.txt", "a");
 $c=$_GET['c'];
 if($c=='') die();
 fwrite($d,$c.'||');
 fclose($d);

只有在 IE 中,UTF-8 编码的字符才会显示为 "?" 或 "[]"。我的编码是 Utf-8 Without BOM,我使用了以下代码:

header('Content-type: text/html; charset=UTF-8');

并且这个:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />

我的php.ini文件中默认编码是utf-8,但在页面上显示出现问号。 我查看了chat.txt文件,并且文件中的字符显示正确,但当使用IE保存文件并在页面上显示时,显示的不是正确的字符而是 "?"。


对于每个($bn作为$bn)的循环会覆盖$bn,因此它将像一个层次结构一样执行。 - Cole Tobin
将bn更改为bn1但没有区别。 - behzad n
3个回答

14

在读取文件时,请使用此函数而不是 fopen。

function utf8_fopen_read($fileName) { 
    $fc = iconv('windows-1250', 'utf-8', file_get_contents($fileName)); 
    $handle=fopen("php://memory", "rw"); 
    fwrite($handle, $fc); 
    fseek($handle, 0); 
    return $handle; 
} 

来源
http://www.php.net/manual/en/function.fopen.php#104325

针对您的情况

$d = utf8_fopen_read("chat.txt", "r");
 $content=fread($d,filesize('chat.txt'));
 $bn=explode('||',$content);
 foreach($bn as $bn)
 echo $bn.'<br>';

试试这个

$content = iconv('windows-1250', 'utf-8', file_get_contents($fileName));
$bn = mb_split('||',$content);
foreach($bn as $b)
     echo $b.'<br>';

不再进行滚动调试会话了...抱歉。 - casperOne

1

您可以使用utf8_encode()对输出的字符串$bn进行编码,如下所示:

$d = fopen("chat.txt", "r");
$content=fread($d,filesize('chat.txt'));
$bn=explode('||',$content);
foreach($bn as $bn)
echo utf8_encode($bn).'<br>';

试一下,看看还是不是很奇怪。


如果您看到此类问题,最有可能的解决方法是确保您正在编写的文件内容为utf8编码。此外,请查看@Venu上面的答案。字符编码问题总是很麻烦的,祝您好运。 - EmmanuelG

1

这个TXT文件是以utf8编码保存的吗?你需要确保TXT文件的编码方式是utf-8,否则你需要使用utf8_encode函数。


我使用UTF8不起作用,改为ANSI并使用utf8_encode仍然不起作用。 - behzad n
我认为你的问题是你的数据再次被重新编码成utf8了,尝试使用utf8_decode而不是utf8_encode。有时候会发生这种情况。 - Yago Riveiro
如果我不使用UTF8,会显示为[pic](http://up.vatandownload.com/images/04pbtwwrpy6vi7xk5u4.jpg) - behzad n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接