如何在PHP中使用ansi编码保存thorn?

68de4m5k  于 2023-04-10  发布在  PHP
关注(0)|答案(2)|浏览(132)

我需要保存一个带有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?

ubby3x7f

ubby3x7f1#

假设你的php文件是utf8格式的,那么下面的代码以Windows-1252编码保存了“?”:

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

您的þ将保存为0xFE(数值:254)。
Windows-1252与ISO-8859-1相同,除了0x 80到0x 9 F。
如果您可以检查十六进制转储,您可以验证FE是否存在(它只需要一个字节)。
但是,在Windows中,所谓的“ANSI”(* 非Unicode *)文本文件的加载方式因系统区域设置而异:

  • 如果Windows系统区域设置为Romanian(罗马尼亚),则“ANSI”文本文件将像ISO-8859-2一样加载,因此0xFE字节将加载为ţ(不是thorn,而是“t with a cedilla”)。如果您查看ISO-8859-2代码页布局,则没有“thorn”字母。

基本上,* 罗马尼亚语 (或其他类似语言)的pre-Unicode编码不支持+字符*。

  • 如果Windows系统区域设置为英语(美国),则会加载一个类似ISO-8859-1的“ANSI”文本文件,这样即使在非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),则实际的方案取决于系统区域设置。

gblwokeq

gblwokeq2#

mb_detect_encoding()做一个猜测:它不能保证生成正确的结果。如果您通过其他方式知道输入文件的字符编码,则会更好。
如果你的文件已经包含了þ的代码点(===字符),它可能已经在windows-1252或iso-8859-1中编码了,不需要转换。
这类工作可能会令人困惑,因为任何文本的输出呈现都取决于系统或应用程序的区域设置。可以假设文件具有与其编码时不同的字符集来呈现文件。使用十六进制转储程序来检查文件。如果可能的话,或将文本文件标准化为utf-8。
你没有给我们足够的信息来帮助你。

相关问题