繁体   English   中英

从PHP编码UTF-8

[英]Encoding in UTF-8 from PHP

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

我正在尝试创建一个被识别为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,则应将其放在文档的顶部:

<?xml version="1.0" encoding="utf-8" ?>

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

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

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 ++正确识别文件。

下载的txt文件没有标题。 当你尝试最终创建XML文件时,你可以在XML声明中指定charset,尝试创建一个简单的XML结构并保存/打开它,然后它应该工作,只要操作系统有utf-8支持,任何现代Linux发行版都应该有的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM