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

How to save thorn with ansi encoding in PHP?

提问人:user2511599 提问时间:4/6/2023 最后编辑:user2511599 更新时间:4/6/2023 访问量:127

问:

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

在 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 时,它将是一个 ?。也许是 Np++ 中的错误?

PHP 编码 特殊字符 ANSI

评论

0赞 qrsngky 4/6/2023
你是如何加载文件的?用?notepad
0赞 user2511599 4/6/2023
我正在使用Notepad++
0赞 qrsngky 4/6/2023
您是否使用 IDE 来编辑 PHP 文件,或者还使用 notepad++?
0赞 user2511599 4/6/2023
我正在使用 Netbeans 15 进行编码
0赞 qrsngky 4/6/2023
在Notepad++中,对于输出文件,您看到还是在右下角?如果是这样,请尝试使用菜单:ISO 8859-2ANSIEncoding > Character sets > Western European > ISO 8859-1

答:

0赞 O. Jones 4/6/2023 #1

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

如果文件已包含代码点 (===character),则该文件可能已在 windows-1252 或 iso-8859-1 中编码,并且不需要转换。þ

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

您没有向我们提供足够的信息来进一步帮助您。

评论

0赞 user2511599 4/6/2023
当你在PHP中创建一个普通的字符串时,我认为它将是UTF-8。您错过了哪些信息?如果可以的话,我会尽我所能提供你需要的信息。
1赞 qrsngky 4/6/2023 #2

假设您的 php 文件是 utf8 格式,那么以下代码会将“þ”保存在 Windows-1252 编码中:

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

您的将另存为(数值:254)。
Windows-1252 与 ISO-8859-1 相同,但0x80 0x9F。
þ0xFE

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


但是,在 Windows 中,所谓的“ANSI”(非 Unicode)中的文本文件的加载方式因系统区域设置而异:

  • 如果 Windows 系统区域设置为罗马尼亚语(罗马尼亚),则会像 ISO-8859-2 一样加载“ANSI”文本文件,因此字节加载为 (不是 thorn,而是 “t with a cedilla”)。 如果你看一下 ISO-8859-2 代码页布局,就会发现没有“刺”字母。
    基本上,罗马尼亚语(或其他类似语言)的 Unicode 前编码不支持 þ 字符
    0xFEţ
  • 如果 Windows 系统区域设置为英语(美国),则会像 ISO-8859-1 一样加载“ANSI”文本文件,以便即使在非 Unicode 程序中也可以看到。但是它不支持.在 ISO-8859-1 代码页布局中,您会看到它完全位于 ISO-8859-2 中预期的位置。þţþţ

其他系统区域设置的解释可能会有所不同,具体取决于适合其语言的 Unicode 前编码。0xFE

要更改区域设置 (Windows 11): 从 中,找到 . 然后单击选项卡。然后,您应该看到“非 Unicode 程序的当前语言”。然后选择“更改系统区域设置...”(您需要管理权限)。SettingsTime & language > Language & region > Administrative language settingsAdministrative

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


对于不支持的字符,文本编辑器必须找到一种方法来删除它们(例如,将它们替换为实际支持的字符),否则它们无法完全保存结果(因为在当前编码中,原始数据没有正确的字节表示形式)。

有时,一个不受支持的字符被简单地替换为 ,有时它是另一个相似的字母(就像你看到的 如何被替换为 )。在任何情况下,除非编码支持该字符,否则您无法正确保存/加载字母。同样,对于 .?ţtþţ

Notepad++ 显示(右下角)它当前使用的编码。如果您看到“ANSI”(并且您的操作系统是 Windows),则实际方案取决于系统区域设置。

评论

0赞 user2511599 4/6/2023
我以为是德语,但原来是不同的东西,不知道为什么,我从来没有改变过。我把它改成德语,看起来不错。谢谢!
0赞 qrsngky 4/6/2023
@user2511599 是的,旧的德语 Windows 编码确实支持 .也许您运行的某些软件更改了语言环境(没有告诉您),或者计算机是在另一个国家/地区购买的,只是显示语言更改为德语?þ
0赞 user2511599 4/6/2023
我自己在德国购买了组件,安装了德国 Windows,所以......这可能是第一种选择。但是不告诉就改变它......?!这也很有趣。:)
0赞 qrsngky 4/6/2023
@user2511599 好吧,恶意软件可能会在不告诉您的情况下更改您的系统设置。