使用PHP在BOM中将字符串编码为UTF-8

Jea*_*ano 24 php byte-order-mark utf-8

使用utf8_encode时如何强制PHP添加BOM?

这是我想要做的:

$zip->addFromString($filename, utf8_encode($xml));
Run Code Online (Sandbox Code Playgroud)

不幸的是(对我来说),结果将不会在开头有BOM标记.

Cha*_*les 64

你有没有尝试过自己添加一个?

UTF-8 BOM似乎是0xEF 0xBB 0xBF,这样你就可以将其连接到您的字符串转换为UTF-8.

$utf8_with_bom = chr(239) . chr(187) . chr(191) . $utf8_string;
Run Code Online (Sandbox Code Playgroud)

但请注意. utf8_encode想要一个ISO-8859-1字符串.如果您正在使用XML,请确保XML 尚未经过 UTF-8编码.对文档的评论表明该功能以各种有趣的方式被破坏,所以除非你知道你需要它,否则你不应该抛弃它.

请记住,PHP字符串只是愚蠢的,不知道的字节.它们没有附加字符集,因此如果字符串中的数据已经是UTF-8,则无需运行转换.

此外,链接的维基百科文章说:

虽然Unicode标准允许使用UTF-8的BOM,但它不需要或推荐它.字节顺序在UTF-8中没有意义,因此BOM仅用于将文本流或文件标识为UTF-8或者是从具有BOM的另一种格式转换的.

您可能不需要开始使用BOM tapdance.

  • 我有一个问题,即如果没有BOM,Excel将无法正确打开我的UTF-8 CSV,因此可能不需要它,但它肯定会有所作为. (11认同)
  • 你可以通过`chr(0xEF).chr(0xBB).chr(0xBF)来使数字看起来不那么"神奇"` - 这样你可以看到它是十六进制的,从那里可以更好地理解它是BOM. (4认同)
  • 请记住,要使 .CSV 文件在 Excel for Mac 中工作,UTF8 BOM 和编码将不起作用 - 您需要将数据转换为 UTF16-LE *并*添加一个 UTF16-LE BOM - http://stackoverflow .com/a/16766198/324220 (2认同)