fwrite()和UTF8

时间:2011-06-13 21:26:43

标签: php utf-8 fwrite

我正在使用php fwrite()创建一个文件,我知道我的所有数据都是UTF8(我已经对此进行了大量测试 - 将数据保存到数据库并在普通网页上输出时,所有工作正常并报告为utf8。) ,但我被告知我输出的文件包含非utf8数据:(在bash(CentOS)中是否有命令检查文件的格式?

使用vim时,它将内容显示为:

  

Donâ〜@〜你做什么......它~~~是的   很棒的网站   一切.... We ~~~ Yve只是   推出/

任何帮助将不胜感激:确认文件是UTF8或如何将utf8内容写入文件。

更新

为了澄清我如何知道我在UTF8中有数据,我已经完成了以下工作:

  1. DB保存数据时设置为utf8
  2. 到数据库我首先运行它:

    $enc = mb_detect_encoding($data);

    $data = mb_convert_encoding($data, "UTF-8", $enc);

  3. 在我运行fwrite之前,我已用检查数据注意每条数据都返回'IS utf-8'

    if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'NOT UTF-8'; else print 'IS utf-8';

  4. 谢谢!

9 个答案:

答案 0 :(得分:26)

如果您知道数据是UTF8而不是您想要设置标题。

我写了一个解决另一个问题的解决方案。

解决方案如下:由于UTF-8字节顺序标记为\xef\xbb\xbf,我们应将其添加到文档的标题中。

<?php
function writeStringToFile($file, $string){
    $f=fopen($file, "wb");
    $file="\xEF\xBB\xBF".$file; // this is what makes the magic
    fputs($f, $string);
    fclose($f);
}
?>

您可以根据代码进行调整,基本上您只需要确保编写UTF8文件(正如您所说,您知道您的内容是UTF8编码的)。

答案 1 :(得分:6)

fwrite()不是二进制安全的。这意味着,您的数据 - 无论是否正确编码 - 可能会被此命令或其基础例程所破坏。

为了安全起见,您应该将fopen()与二进制模式标志一起使用。那是b。之后,fwrite()将“按原样”保护您的字符串数据,这是PHP中的二进制数据,因为PHP中的字符串是二进制字符串。

背景:某些系统在文本和二进制数据之间存在差异。二进制标志将在此类系统上显式命令PHP以使用二进制输出。当你处理UTF-8时,你应该注意数据不会被管理。通过将字符串数据作为二进制数据处理来防止这种情况。

但是:如果你的问题中没有告诉你保留了数据的UTF-8编码,那么你的编码就会被破坏,甚至二进制安全处理也会保持破坏状态。但是,使用二进制标志,您仍然可以确保这不是应用程序的fwrite()部分。

这里写的另一个答案是正确的,如果你只有数据,你就不知道编码。但是,您可以验证数据是否验证UTF-8编码,因此至少有机会检查编码。这是PHP中的一个函数我发布了一个UTF-8相关的问题所以如果你需要调试它可能对你有用:Answer to: SimpleXML and Chinese寻找 can_be_valid_utf8_statemachine ,那是函数的名称。

答案 2 :(得分:2)

问题是您的数据是双重编码的。我假设您的原始文本类似于:

Don’t do anything

,即不是直撇号,而是right single quotation mark.

如果您使用此内容编写PHP脚本并以UTF-8编码:

<?php
//File in UTF-8
echo utf8_encode("Don’t"); //this will double encode

你会得到与你的输出相似的东西。

答案 3 :(得分:1)

//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));

I find this piece works for me :)

答案 4 :(得分:0)

I know all my data is in UTF8 - 错误。
编码它不是文件的格式。因此,请检查页面标题中的字符集,从中获取数据:
header("Content-type: text/html; charset=utf-8;");
并检查数据是否真的采用多字节编码:
if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'not UTF-8';
else print 'utf-8';

答案 5 :(得分:0)

$handle = fopen($file,"w");
fwrite($handle, pack("CCC",0xef,0xbb,0xbf));
fwrite($handle,$file); 
fclose($handle);

答案 6 :(得分:0)

有一些原因: 首先,您从数据库中获取信息,它不是 utf-8。 如果您确定这是真的,请使用它,我总是使用它并且它有效:

$file= fopen('../logs/logs.txt','a');
fwrite($file,PHP_EOL."_____________________output_____________________".PHP_EOL);
fwrite($file,print_r($value,true));

答案 7 :(得分:-1)

我唯一需要做的就是在CSV中添加一个UTF8 BOM,数据是正确的但文件阅读器(外部应用程序)无法在没有BOM的情况下正确读取文件

答案 8 :(得分:-3)

尝试使用这种更有用的简单方法,并在标签<body>之前添加到页面顶部:

<head>
  <meta charset="utf-8">
</head>
相关问题