当前位置:  开发笔记 > 编程语言 > 正文

从PHP编码UTF-8

如何解决《从PHP编码UTF-8》经验,为你挑选了3个好方法。

我对编码不是很好,但我甚至在这里基本没法考虑.

我正在尝试创建一个被识别为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.

在此先感谢您的帮助!



1> troelskn..:

正如Filip所说,编码不是文件的固有属性; 这是隐含的.这意味着除非您知道要解释文件的编码,否则无法确定它.你能做的最好的就是做出猜测.这可能是Notepad ++等程序所做的.由于您发送的实际数据可以用许多不同的编码进行解释,因此它只选择最喜欢的候选者.对于Notepad ++,这似乎是ANSI(这本身就是一个相当不准确的分类),而其他程序可能默认为其他程序.

您必须在HTTP标头中指定字符集的原因正是因为文件本身不包含此信息,因此需要通知浏览器.将文件保存到磁盘后,此信息将无法使用.

如果要提供的文件是XML文档,则可以选择将编码信息放在实际文档中.这样,文件保存到磁盘后就会保留.例如.如果您使用的是utf-8,则应将其放在文档的顶部:


请注意,除了获取有关字符集的元信息之外,您还需要确保您提供的数据实际上是utf-8编码的.这是一个相同的场景:你需要隐含地知道你的数据是什么编码.函数utf8_encode是(尽管名称)明确用于将iso-8859-1转换为utf-8.因此,如果你在已经使用utf-8编码的数据上使用它,你会得到它的双重编码,结果是乱码数据.

字符集本身并不复杂.问题是,如果你不小心保持紧张,你就会搞砸了.每当你有一个字符串时,你应该绝对肯定你知道它在哪个编码.否则它不是一个字符串 - 它只是一个二进制数据的blob.



2> Gumbo..:

test都是ASCII.所以没有必要使用UTF-8.

但事实上,Unicode字符集的前128个字符与ASCII的字符集相同.UTF-8使用与ASCII相同的代码.有关更多信息,请参阅Wikipedia对UTF-8的描述.


@Lizard:您需要使用不在ASCII字符集中的字符来查看差异.

3> Filip Navara..:

下载文件后,它不再携带有关编码的信息,因此Notepad ++必须从内容中猜测它.有一个名为Byte-Order-Mark的东西允许在内容中通过前缀指定UTF编码.

请参阅问题"当使用BOM时,是否仅使用16位Unicode文本?" .

我想echo "\xEF\xBB\xBF"在编写实际内容之前使用类似的东西会强制Notepad ++正确识别文件.


我不建议使用BOM.这很有异国情调.
UTF-8设计为可从其字节序列中检测到.您不需要BOM.实际上它只由Microsoft实现,使用它只会给跨平台带来问题.
虽然BOM在各处都无用,但应仔细考虑它们的使用,说明它们是异国情调或非Microsoft系统不支持它们是完全错误的.MacOS X和Linux/BSD/Unix上的许多文本编辑器也支持它.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有