PHP的文件写入功能的编码是什么?

时间:2014-09-09 09:38:51

标签: php utf-8

我使用this function.csv文件转换为JSON。 (.csv文件的内容是中文。)然后我使用JSONfile_put_contents('myfile.json',$JSON)字符串写入文件。

使用记事本打开时

myfile.json正确显示,命令行时回显,但使用 Sublime Text 打开时,会显示像这样可怕的文字:

[{"¶mÂí¥«°Ï":"«n¬ñ¶m","¥æ©ö¼Ðªº":"¤g¦a", ........  }]

Chrome 打开时会发出同样难看的文字。

我从记事本复制正确的文字并将其粘贴在 Sublime Text 上。 Sublime Text 正确呈现。我将新文件保存在 Sublime Text 并重新打开,然后呈现正确。

问题:

  1. 为什么不同的应用程序会以不同的方式呈现相同的文字,因为我确定它们全部都是" 准备好"提交UTF-8文字?

  2. Chrome 中,为什么echo file_get_contents("ChineseText.txt")echo '張三'给出预期结果时会发出可怕的文字?

  3. 我知道我没有发表明确的问题陈述。我会尽快回复你的评论,因为这是困扰我很长一段时间的问题。提前谢谢。

    ---的更新 ---

    受@KyawLay的启发,我做了一个快速的实验。

    我已将file_put_contents修改为file_put_contents("myFile", utf8_encode($result);。然后在记事本中打开时,它会显示与Sublime Text和Chrome中完全相同的丑陋文本。我想这是因为文本已被编码两次。因此,首先,Chrome和Sublime Text必须在后台编码文本,导致双重编码问题,因此呈现错误。这是对的吗?

1 个答案:

答案 0 :(得分:1)

file_put_contents不进行任何编码转换,它只是将原始字节转储到原始文件中。由于您可以在一个应用程序中看到预期的内容,这意味着这是有效的。由于您正在使用的该函数本身不进行任何编码转换,这意味着结果与原始文件的编码相同,无论是什么。

问题很简单,纯文本文件不会在任何地方声明其编码。它只是原始字节的累积。完全由读取应用程序来解释正确编码中的那些字节。在这种情况下,记事本碰巧正确地做到了,Sublime恰好猜错了。如果你打开文件明确地告诉Sublime它的编码是什么,它也应该做得很好(不确定该选项在Sublime中的确切位置)。您的浏览器也是如此;如果您没有通过Content-Type HTTP标头告诉它您发送的内容的编码,可能会猜错。

顺便说一句,你不应该像手头那样用手工拼凑JSON,你应该使用json_encode。为此,您可能需要将CSV数据从其中的任何编码转换为UTF-8,因为json_encode仅适用于UTF-8。

当您执行echo '張三'或将内容复制并粘贴到Sublime时,它会起作用,因为这样内容会以Sublime保存的任何编码保存(可能是UTF-8),这恰好是您的浏览器所期望的默认情况下。

我建议What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text作为编码的介绍。