从PHP编码UTF-8

Liz*_*ard 2 php xml encoding utf-8

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

我正在尝试创建一个被识别为UTF-8的文件

header("Content-Type: text/plain; charset=utf-8");
header("Content-disposition: attachment; filename=test.txt");
echo "test";
exit();
Run Code Online (Sandbox Code Playgroud)

也试过了

header("Content-Type: text/plain; charset=utf-8");
header("Content-disposition: attachment; filename=test.txt");
echo utf8_encode("test");
exit();
Run Code Online (Sandbox Code Playgroud)

然后我用Notepad ++打开文件,它说它的当前编码是ANSI而不是UTF-8,我错过了如何输出这个文件.

我最终将为Affiliate Window程序输出产品的XML文件.如果它有助于我的网络服务器是Centos,Apache2,PHP 5.2.8.

在此先感谢您的帮助!

tro*_*skn 7

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

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

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

<?xml version="1.0" encoding="utf-8" ?>
Run Code Online (Sandbox Code Playgroud)

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

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


Gum*_*mbo 6

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

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

  • @Lizard:您需要使用不在ASCII字符集中的字符来查看差异. (2认同)

Fil*_*ara 5

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

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

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

  • 我不建议使用BOM.这很有异国情调. (2认同)
  • UTF-8设计为可从其字节序列中检测到.您不需要BOM.实际上它只由Microsoft实现,使用它只会给跨平台带来问题. (2认同)
  • 虽然BOM在各处都无用,但应仔细考虑它们的使用,说明它们是异国情调或非Microsoft系统不支持它们是完全错误的.MacOS X和Linux/BSD/Unix上的许多文本编辑器也支持它. (2认同)