我正在使用php fwrite()创建一个文件,我知道我的所有数据都是UTF8(我已经对此进行了大量测试 - 将数据保存到数据库并在普通网页上输出时,所有工作正常并报告为utf8。) ,但我被告知我输出的文件包含非utf8数据:(在bash(CentOS)中是否有命令检查文件的格式?
使用vim时,它将内容显示为:
Donâ〜@〜你做什么......它~~~是的 很棒的网站 一切.... We ~~~ Yve只是 推出/
任何帮助将不胜感激:确认文件是UTF8或如何将utf8内容写入文件。
的更新 的
为了澄清我如何知道我在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';
谢谢!
答案 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) ));
答案 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>