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


What is the encoding of PHP's file-writing function?

我正在使用此函数将.csv文件转换为JSON。(.csv文件的内容是中文。)然后我用file_put_contents('myfile.json',$JSON)JSON字符串写入文件。

myfile.json在使用记事本打开和在命令行中响应时显示正确,但在使用Sublime Text时,会喷出如下可怕的文本:

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

Chrome浏览器上打开时,会出现同样难看的文本。

我从记事本复制正确的文本,并将其粘贴到Sublime文本Sublime文本正确渲染。我将新文件保存在Sublime Text并重新打开它,它就会正确渲染。

问题:

  1. 当我确信不同的应用程序都"准备好"渲染UTF-8文本时,为什么它们会以不同的方式渲染相同的文本?

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

我知道我没有给出一个明确的问题陈述。我会尽快回复你的意见,因为这是困扰我很长时间的问题。提前谢谢。

---更新---

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

我把file_put_contents编辑成了file_put_contents("myFile", utf8_encode($result);。然后,当在记事本中打开时,它会显示与Sublime text和Chrome中完全相同的丑陋文本。我想是因为文本被编码了两次。因此,首先,Chrome和Sublime Text必须在后台对文本进行编码,从而导致双重编码问题,从而导致渲染错误。这是正确的吗?

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

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

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

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

我推荐每个程序员绝对、积极地需要知道的关于编码和使用文本的字符集的内容作为编码的介绍。