gpt4 book ai didi

php - 什么是 "ANSI as UTF-8"以及如何使 fputcsv() 生成带 BOM 的 UTF-8?

转载 作者:IT王子 更新时间:2023-10-29 00:00:24 31 4
gpt4 key购买 nike

我制作了一个 PHP 脚本,用于生成之前由另一个进程生成的 CSV 文件。然后,必须通过另一个过程导入 CSV 文件。

旧 CSV 文件的导入工作正常,但在导入新 CSV 文件时出现特殊字符问题。

当我用 Notepad++ 打开旧的 CSV 时,它说编码是 UTF-8,而当我用它打开新的 CSV 时,它说它们的编码是“ANSI as UTF-8”。

两者有什么区别?

我怎样才能使 fopen 和 fputcsv 使用“纯”? UTF-8编码?

谢谢!

最佳答案

文件没有问题。 “ANSI as UTF-8”表示没有 BOM,但 Notepad++ 通过分析字节模式明确地将编码识别为 UTF-8。我通过创建一个包含俄语、希腊语和波兰语文本的文件并将其保存为不带 BOM 的 UTF-8 格式来对此进行测试。在这里:

# Russian
Следующая

# Greek
Επόμενη

# Polish
Więcej

我在不同的编辑器 (EditPad Pro) 中执行此操作并使用十六进制模式来确保 BOM 不存在。当我在 NPP 中打开它时,它显示编码为“ANSI as UTF-8”并且所有字符都正确显示。然后,仍然在十六进制模式下,我删除了第一个俄语字符的第一个字节。当我再次在 NPP 中打开它时,它显示编码为“ANSI”并将文本的非 ASCII 部分显示为 mojibake。 :

; Russian
¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ

; Greek
Επόμενη

; Polish
Więcej

回到EditPad,这次我添加了一个BOM但是没有修复Cyrillic字符。这次 NPP 报告编码为“UTF-8”,除第一个俄语字符外,所有内容均正确显示,如下所示。 “A1”是 UTF-8 中该字符的第二个字节的十六进制表示。它以倒置的配色方案显示以指示错误。

# Russian
A1ледующая

# Greek
Επόμενη

# Polish
Więcej

总结一下:在没有 BOM 的情况下,Notepad++ 会查找不能表示 ASCII 字符的字节,因为它们的值大于 127(或 7F 十六进制)。如果找到任何内容,但它们都符合 UTF-8 要求的模式,它将文件解码为 UTF-8,并在状态栏中报告编码为“ANSI as UTF-8”。

但是如果它发现即使有一个字节不符合 UTF-8 行,它也会将文件解码为“ANSI”,这意味着底层平台的默认单字节编码。如果您的文件已损坏,您将看到这种情况。

编辑:尽管您的文件没有它也是有效的,但是您可以通过在文件的最开头手动写入三个字节 "EF BB BF" 来添加 BOM --但应该有更好的方法。您现在如何生成内容?因为它 UTF-8,其中某处至少有一个非 ASCII 字符;否则,NPP 会将其报告为“ANSI”。

要考虑的另一种可能性:如果您对使用 CSV 文件的进程有任何影响,也许您可​​以将其配置为期望没有 BOM 的 UTF-8。从技术上讲,任何可以 BOM 而没有 的 BOM 解码 UTF-8 的软件都被破坏了。 Unicode 联盟实际上不鼓励使用 UTF-8 BOM,并不是说任何人都在听。

关于php - 什么是 "ANSI as UTF-8"以及如何使 fputcsv() 生成带 BOM 的 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1380690/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com