我需要保存一个带有ansi编码的文本文件,其中包含PHP中的特殊字符“thorn”或“†”。当我简单地将thorn放入PHP中时,它在文件中看起来像“”。我尝试了许多不同的方法,但都没有运气,不知道如何正确保存thorn。您能给予我一些建议吗?谢谢。
after iconv('UTF-8','Windows-1252',$this-〉filedata);(mb_convert_encoding()也没有区别)
==〉
utf8_encode(“”)==〉
我使用Netbeans 15进行编码,使用notepad8.4.8检查结果
有件事很奇怪:我有一个PHP生成的ANSI文本文件,其中的刺看起来像,当我将它复制/粘贴到另一个用Notepad创建的ANSI文本文件时,它只是作为t插入。当我用Notepad转换刺时,它将是?。也许是Np中的一个bug?
2条答案
按热度按时间ubby3x7f1#
假设你的php文件是utf8格式的,那么下面的代码以Windows-1252编码保存了“?”:
您的
þ
将保存为0xFE
(数值:254)。Windows-1252与ISO-8859-1相同,除了0x 80到0x 9 F。
如果您可以检查十六进制转储,您可以验证
FE
是否存在(它只需要一个字节)。但是,在Windows中,所谓的“ANSI”(* 非Unicode *)文本文件的加载方式因系统区域设置而异:
0xFE
字节将加载为ţ
(不是thorn,而是“t with a cedilla”)。如果您查看ISO-8859-2代码页布局,则没有“thorn”字母。基本上,* 罗马尼亚语 (或其他类似语言)的pre-Unicode编码不支持+字符*。
þ
。但它不支持ţ
。在ISO-8859-1代码页布局中,您会看到þ
正好放置在ISO-8859-2中预期的ţ
位置。其他系统区域设置可能会根据哪种pre-Unicode编码适合其语言而以不同的方式解释
0xFE
。要更改区域设置(Windows 11):在
Settings
中,找到Time & language > Language & region > Administrative language settings
。然后单击Administrative
选项卡。然后您应该看到“非Unicode程序的当前语言”。然后选择“更改系统区域设置...”(您需要管理员权限)。(Note区域设置可能与Windows显示语言不同)。
对于不受支持的字符,文本编辑器必须找到一种方法来消除它们(例如,用实际支持的字符替换它们),否则它们无法准确地保存结果(因为在 * 当前编码 * 中,原始数据没有正确的 * 字节表示 *)。
有时候不支持的字符被简单地替换为
?
,有时候它是另一个类似的字母(就像你看到ţ
是如何被替换为t
的)。在任何情况下,你都不能正确地保存/加载字母þ
*,除非编码支持该字符 *。ţ
也是如此。Notepad++显示(右下角)当前使用的编码。如果您看到“ANSI”(并且您的操作系统是Windows),则实际的方案取决于系统区域设置。
gblwokeq2#
mb_detect_encoding()做一个猜测:它不能保证生成正确的结果。如果您通过其他方式知道输入文件的字符编码,则会更好。
如果你的文件已经包含了
þ
的代码点(===字符),它可能已经在windows-1252或iso-8859-1中编码了,不需要转换。这类工作可能会令人困惑,因为任何文本的输出呈现都取决于系统或应用程序的区域设置。可以假设文件具有与其编码时不同的字符集来呈现文件。使用十六进制转储程序来检查文件。如果可能的话,或将文本文件标准化为utf-8。
你没有给我们足够的信息来帮助你。