我使用this function将.csv
文件转换为JSON
。 (.csv
文件的内容是中文。)然后我使用JSON
将file_put_contents('myfile.json',$JSON)
字符串写入文件。
myfile.json
正确显示,命令行时回显,但使用 Sublime Text 打开时,会显示像这样可怕的文字:
[{"¶mÂí¥«°Ï":"«n¬ñ¶m","¥æ©ö¼Ðªº":"¤g¦a", ........ }]
在 Chrome 打开时会发出同样难看的文字。
我从记事本复制正确的文字并将其粘贴在 Sublime Text 上。 Sublime Text 正确呈现。我将新文件保存在 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必须在后台编码文本,导致双重编码问题,因此呈现错误。这是对的吗?
答案 0 :(得分:1)
file_put_contents
不进行任何编码转换,它只是将原始字节转储到原始文件中。由于您可以在一个应用程序中看到预期的内容,这意味着这是有效的。由于您正在使用的该函数本身不进行任何编码转换,这意味着结果与原始文件的编码相同,无论是什么。
问题很简单,纯文本文件不会在任何地方声明其编码。它只是原始字节的累积。完全由读取应用程序来解释正确编码中的那些字节。在这种情况下,记事本碰巧正确地做到了,Sublime恰好猜错了。如果你打开文件明确地告诉Sublime它的编码是什么,它也应该做得很好(不确定该选项在Sublime中的确切位置)。您的浏览器也是如此;如果您没有通过Content-Type
HTTP标头告诉它您发送的内容的编码,可能会猜错。
json_encode
。为此,您可能需要将CSV数据从其中的任何编码转换为UTF-8,因为json_encode
仅适用于UTF-8。
当您执行echo '張三'
或将内容复制并粘贴到Sublime时,它会起作用,因为这样内容会以Sublime保存的任何编码保存(可能是UTF-8),这恰好是您的浏览器所期望的默认情况下。