在没有bom的情况下以utf-8保存文件

Posted

技术标签:

【中文标题】在没有bom的情况下以utf-8保存文件【英文标题】:save file in utf-8 without bom 【发布时间】:2012-06-17 21:09:42 【问题描述】:

我有一个越南语表格,它将数据提交到网络服务。此 Web 服务将该数据保存在一个文件中。但是文件总是包含“0000”,没有别的......

在没有bom的情况下以utf-8保存数据编码的正确方法是什么?谢谢

这是我的 webservice.php

if ($_SERVER["REQUEST_METHOD"] == "POST")
    $data = $_POST["author"] . "\n" . $_POST["title"] . "\n" + $_POST["category"] . "\n" + $_POST["article"];
    $fileName = mb_convert_encoding($_REQUEST["author"], "UTF-8", "auto");
    $data = mb_convert_encoding($data, 'UTF-8', "auto");
    file_put_contents($fileName, $data, FILE_APPEND | LOCK_EX);
    print $data;
else
    invalidRequest();
 ?>

【问题讨论】:

为什么需要转换?如果您使用 UTF8 格式制作页面,您应该能够准确地写入文件。 一项小研究表明,mb_convert_encoding 不支持没有BOMUTF-8。要解决此问题,您可能需要从该字段中删除前 3 个字节。 对不起,我是 php 新手,你能更清楚地解释如何从字段中删除 3 个字节吗?起初我没有进行转换,但文件也只包含 "00000" 。顺便说一句,我在没有 Bom 的情况下用 UTF-8 对我的表单进行了编码。谢谢大家@fastreload @fastreload - mb_convert_encoding 与文件中的数据有什么关系,无论是否有 BOM? b/c 我在这里读到一篇文章,说如果我想用 utf8 保存文件,那么我必须使用 mb_convert_encoding 【参考方案1】:

您缺少 file_put_contents() 的文件名参数,您的代码不会将任何内容保存到文件中。


<edit>

也看看这个:

  + $_POST["category"] . "\n" + $_POST["article"];
  ^                           ^

您在此处使用数学运算符 +,因此您的字符串将被转换为数字(在这种情况下为 0)

【讨论】:

【参考方案2】:

您的表单应包含

<form ... accept-charset="UTF-8">

然后您可以在没有 mb_convert_encoding() 的情况下写入文件。但永远不要使用

$fileName = $_REQUEST["author"];

!类似的东西

$fileName = $author_names[$_REQUEST["author_id"]];

应该是安全的。

【讨论】:

对不起。它不起作用。与没有 BOM 的 UTF-8 有什么关系吗?谢谢 嗯,你提到的“0000”不是BOM。请参阅 link 了解 BOM 的外观。我会尝试通过删除不必要的转换来缩小问题范围。并且需要“接受字符集”来告诉浏览器发送 UTF-8,因此不必发生错误的服务器端转换。你用不同的浏览器试过了吗?

以上是关于在没有bom的情况下以utf-8保存文件的主要内容,如果未能解决你的问题,请参考以下文章

Delphi - TStringList保存的文件如何避免保持为UTF-8 BOM格式?

java怎样保存xml文件为UTF-8 + bom

没有 BOM 的 UTF-8 html 显示奇怪的字符

无 BOM 的 UTF-8

UTF-8和UTF—8Bom的区别

python基础:字符编码问题三个不可见的字符(0xEF 0xBB 0xBF,即BOM)