我正在使用此函数将.csv
文件转换为JSON
。(.csv
文件的内容是中文。)然后我用file_put_contents('myfile.json',$JSON)
将JSON
字符串写入文件。
myfile.json
在使用记事本打开和在命令行中响应时显示正确,但在使用Sublime Text时,会喷出如下可怕的文本:
[{"¶mÂí¥«°Ï":"«n¬ñ¶m","¥æ©ö¼Ðªº":"¤g¦a", ........ }]
在Chrome浏览器上打开时,会出现同样难看的文本。
我从记事本复制正确的文本,并将其粘贴到Sublime文本上Sublime文本正确渲染。我将新文件保存在Sublime Text并重新打开它,它就会正确渲染。
问题:
当我确信不同的应用程序都"准备好"渲染
UTF-8
文本时,为什么它们会以不同的方式渲染相同的文本?在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-Type
HTTP头告诉它你发送的内容是什么编码的,它可能猜错了。
顺便说一句,你不应该像那个函数那样手工拼凑JSON,你应该使用json_encode
。为此,您可能需要将CSV数据从任何编码转换为UTF-8,因为json_encode
仅适用于UTF-8。
当您执行echo '張三'
或将内容复制并粘贴到Sublime中时,它会起作用,因为然后内容会以Sublime保存为的任何编码保存(可能是UTF-8),这恰好是您的浏览器默认期望的。
我推荐每个程序员绝对、积极地需要知道的关于编码和使用文本的字符集的内容作为编码的介绍。