我必须保存一个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-Unicode对0xFE
进行不同的解释编码适合他们的语言。
更改区域设置(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。
你没有给我们足够的信息来进一步帮助你。