我对编码不是很好,但我甚至在这里基本没法考虑.
我正在尝试创建一个被识别为UTF-8的文件
header("Content-Type: text/plain; charset=utf-8"); header("Content-disposition: attachment; filename=test.txt"); echo "test"; exit();
也试过了
header("Content-Type: text/plain; charset=utf-8"); header("Content-disposition: attachment; filename=test.txt"); echo utf8_encode("test"); exit();
然后我用Notepad ++打开文件,它说它的当前编码是ANSI而不是UTF-8,我错过了如何输出这个文件.
我最终将为Affiliate Window程序输出产品的XML文件.如果它有助于我的网络服务器是Centos,Apache2,PHP 5.2.8.
在此先感谢您的帮助!
正如Filip所说,编码不是文件的固有属性; 这是隐含的.这意味着除非您知道要解释文件的编码,否则无法确定它.你能做的最好的就是做出猜测.这可能是Notepad ++等程序所做的.由于您发送的实际数据可以用许多不同的编码进行解释,因此它只选择最喜欢的候选者.对于Notepad ++,这似乎是ANSI(这本身就是一个相当不准确的分类),而其他程序可能默认为其他程序.
您必须在HTTP标头中指定字符集的原因正是因为文件本身不包含此信息,因此需要通知浏览器.将文件保存到磁盘后,此信息将无法使用.
如果要提供的文件是XML文档,则可以选择将编码信息放在实际文档中.这样,文件保存到磁盘后就会保留.例如.如果您使用的是utf-8,则应将其放在文档的顶部:
请注意,除了获取有关字符集的元信息之外,您还需要确保您提供的数据实际上是utf-8编码的.这是一个相同的场景:你需要隐含地知道你的数据是什么编码.函数utf8_encode
是(尽管名称)明确用于将iso-8859-1转换为utf-8.因此,如果你在已经使用utf-8编码的数据上使用它,你会得到它的双重编码,结果是乱码数据.
字符集本身并不复杂.问题是,如果你不小心保持紧张,你就会搞砸了.每当你有一个字符串时,你应该绝对肯定你知道它在哪个编码.否则它不是一个字符串 - 它只是一个二进制数据的blob.
test
都是ASCII.所以没有必要使用UTF-8.
但事实上,Unicode字符集的前128个字符与ASCII的字符集相同.UTF-8使用与ASCII相同的代码.有关更多信息,请参阅Wikipedia对UTF-8的描述.
下载文件后,它不再携带有关编码的信息,因此Notepad ++必须从内容中猜测它.有一个名为Byte-Order-Mark的东西允许在内容中通过前缀指定UTF编码.
请参阅问题"当使用BOM时,是否仅使用16位Unicode文本?" .
我想echo "\xEF\xBB\xBF"
在编写实际内容之前使用类似的东西会强制Notepad ++正确识别文件.