提问人:user2511599 提问时间:4/6/2023 最后编辑:user2511599 更新时间:4/6/2023 访问量:127
如何在PHP中使用ansi编码保存刺?
How to save thorn with ansi encoding in PHP?
问:
我必须保存一个带有 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++ 中的错误?
答:
mb_detect_encoding() 进行猜测:不能保证生成正确的结果。如果您通过其他方式知道输入文件的字符编码,那就更好了。
如果文件已包含代码点 (===character),则该文件可能已在 windows-1252 或 iso-8859-1 中编码,并且不需要转换。þ
这种工作可能会令人困惑,因为任何文本的输出呈现都取决于系统或应用程序区域设置。可以呈现一个文件,假设它具有与编码时使用的字符集不同的字符集。使用十六进制转储程序检查文件。或者,如果可能的话,在 utf-8 上标准化您的文本文件。
您没有向我们提供足够的信息来进一步帮助您。
评论
假设您的 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 程序的当前语言”。然后选择“更改系统区域设置...”(您需要管理权限)。Settings
Time & language > Language & region > Administrative language settings
Administrative
(请注意,区域设置可能与 Windows 显示语言不同)。
对于不支持的字符,文本编辑器必须找到一种方法来删除它们(例如,将它们替换为实际支持的字符),否则它们无法完全保存结果(因为在当前编码中,原始数据没有正确的字节表示形式)。
有时,一个不受支持的字符被简单地替换为 ,有时它是另一个相似的字母(就像你看到的 如何被替换为 )。在任何情况下,除非编码支持该字符,否则您无法正确保存/加载字母。同样,对于 .?
ţ
t
þ
ţ
Notepad++ 显示(右下角)它当前使用的编码。如果您看到“ANSI”(并且您的操作系统是 Windows),则实际方案取决于系统区域设置。
评论
þ
评论
notepad
ISO 8859-2
ANSI
Encoding > Character sets > Western European > ISO 8859-1