fwrite()和UTF8

| 我正在使用php fwrite()创建一个文件,并且我知道我的所有数据都在UTF8中(我已经对此进行了广泛的测试-将数据保存到db并在常规网页上输出时,所有工作都很好,并报告为utf8。),但是我被告知我正在输出的文件包含非utf8数据:( bash(CentOS)中是否有命令检查文件格式? 使用vim时,其内容显示为:   不要做任何事情....它@@〜是   很棒的网站   一切……我们……只是   发射/ 任何帮助将不胜感激:确认文件为UTF8或如何将utf8内容写入文件。 更新 为了澄清我如何知道我在UTF8中有数据,我做了以下工作: 保存数据时将DB设置为utf8 到数据库,我首先运行这个:
$enc = mb_detect_encoding($data);
$data = mb_convert_encoding($data, \"UTF-8\", $enc);
在我运行fwrite之前,我已经用注释检查了数据,每条数据都返回\'IS utf-8 \'
if (strlen($data)==mb_strlen($data, \'UTF-8\')) print \'NOT UTF-8\';
else print \'IS utf-8\';
谢谢!     
已邀请:
        如果您知道数据位于UTF8中,则要设置标题。 我写了一个解决方案来回答另一个问题。 解决方案如下:由于UTF-8字节顺序标记为“ 3”,因此应将其添加到文档的标题中。
<?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编码的)。     
        
fwrite()
不是二进制安全的。这意味着您的数据(无论是否经过正确编码)可能会被此命令或其基础例程破坏。 为了安全起见,应在二进制模式标志中使用
fopen()
。那是七英镑。之后,“ 5”将按“原样”保护您的字符串数据,并且直到现在为止在PHP中都是二进制数据,因为PHP中的字符串是二进制字符串。 背景:某些系统在文本数据和二进制数据之间有所不同。二进制标志将明确命令此类系统上的PHP使用二进制输出。处理UTF-8时,应注意不要弄乱数据。通过将字符串数据作为二进制数据进行处理可以避免这种情况。 但是:如果您不像在问题中告诉您的那样,保留了数据的UTF-8编码,则编码将被破坏,甚至二进制安全处理也将保持破坏状态。但是,使用二进制标志,您仍要确保这不是破坏应用程序的“ 5”部分。 正确地在这里的另一个答案中写道,如果仅包含数据,则不知道编码。但是,您可以验证数据是否验证UTF-8编码,因此至少为您提供了一些检查编码的机会。我已经在UTF-8相关问题中发布了此函数中的PHP函数,因此如果您需要调试,它可能对您有用:答案:SimpleXML和中文查找can_be_valid_utf8_statemachine,这就是名称功能的     
        问题是您的数据是双重编码的。我认为您的原始文字是这样的: 什么都不做 用“ 10”表示,即不是直撇号,而是右单引号。 如果您编写具有此内容并以UTF-8编码的PHP脚本:
<?php
//File in UTF-8
echo utf8_encode(\"Don’t\"); //this will double encode
您将得到与您的输出类似的东西。     
        
//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
我发现这件作品对我有用:)     
        
$handle = fopen($file,\"w\");
fwrite($handle, pack(\"CCC\",0xef,0xbb,0xbf));
fwrite($handle,$file); 
fclose($handle);
    
        
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\';
    
        我唯一要做的就是将utf8 BOM添加到CSV中,数据是正确的,但是如果没有BOM,文件阅读器(外部应用程序)将无法正确读取文件     
        尝试使用这种更有用的简单方法,并将其添加到标签tag17ѭ之前的页面顶部:
<head>
  <meta charset=\"utf-8\">
</head>
    

要回复问题请先登录注册