如何在PHP中保存刺与ansi编码?



我必须保存一个ansi编码的文本文件,其中包含特殊字符"thorn"或";þ";在PHP中。当我在PHP中简单地放置这个刺时,它将看起来像"ţ"在文件中。我尝试了许多不同的方法,但都没有运气,不知道如何才能正确地挽救那根刺。你能给我一些建议吗?谢谢你。

after iconv('UTF-8', 'Windows-1252', $this->filedata);(mb_convert_encoding()也没有区别)

þ= =比;ţ

utf8_encode("þ")= =比;Ăľ

我使用Netbeans 15编码和notepad++ 8.4.8检查结果

有些东西很奇怪:我有PHP生成的ANSI文本文件,其中的刺看起来像+,当我复制/粘贴到另一个用notepad++创建的ANSI文本文件时,它被简单地插入为t。当我用notepad++转换thorn时,它将是一个?。也许是n++中的一个bug ?

假设您的php文件是utf8格式,那么下面的代码将保存"在Windows-1252编码:

$text = iconv('UTF-8', 'Windows-1252', 'þ');
file_put_contents('./output.txt', $text);

您的þ将被保存为0xFE(数值:254)。
Windows-1252与ISO-8859-1相同,除了0x80到0x9F。

如果你可以检查十六进制转储,你可以验证FE在那里(它只需要一个字节)。


然而,在Windows中,一个文本文件在所谓的"ansi"中;(非unicode)的加载方式取决于您的系统语言环境:

  • 如果Windows系统区域设置是罗马尼亚语(罗马尼亚),则使用"ANSI"文本文件像ISO-8859-2一样加载,因此0xFE字节被加载为ţ(不是thorn,而是带有一个cedilla")。如果你看一下ISO-8859-2代码页面布局,就会发现没有"刺"。信。
    基本上,pre-Unicode罗马尼亚语(或其他类似语言)的编码不支持þ字符
  • 如果Windows系统区域设置为英语(美国),则使用"ANSI"像ISO-8859-1一样加载文本文件,这样即使在非unicode程序中也可以看到þ。但是它不支持ţ。在ISO-8859-1代码页布局中,您可以看到þ正好位于ISO-8859-2中ţ的位置。

其他系统语言环境可能会根据pre-Unicode0xFE进行不同的解释编码适合他们的语言。

更改区域设置(Windows 11):从Settings,找到Time & language > Language & region > Administrative language settings。然后点击Administrative选项卡。然后您应该看到&;非unicode程序的当前语言&;。然后选择"更改系统区域设置"。(您需要管理员权限)。

(注意区域设置可能与Windows显示语言不同)。


对于不支持的字符,文本编辑器必须找到一种方法来摆脱它们(例如,通过用实际支持的字符替换它们),否则它们不能准确地保存结果(因为当前编码中的原始数据没有正确的字节表示)。

有时不支持的字符被简单地替换为?,有时它是另一个类似的字母(就像你看到的ţt替换)。在任何情况下,您都不能正确保存/加载字母þ,除非编码支持该字符ţ也一样。

notepad++显示(右下角)当前使用的编码。如果你看到&;ansi &;(并且您的操作系统是Windows),那么实际的方案取决于系统区域设置。

mb_detect_encoding()做了一个猜测:它不能保证生成正确的结果。如果您通过其他方式知道输入文件的字符编码,那么您会更好。

如果你的文件已经包含þ的代码点(===字符),它可能已经在windows-1252或iso-8859-1中编码,不需要转换。

这种工作可能会令人困惑,因为任何文本的输出呈现都取决于系统或应用程序的区域设置。可以假设文件的字符集与编码时使用的字符集不同,从而呈现该文件。使用十六进制转储程序检查该文件。或者如果可能的话,将文本文件标准化为utf-8。

你没有给我们足够的信息来进一步帮助你。

最新更新