PHP中如何以ANSI编码保存含thorn(þ)字符的文本文件?
PHP保存Thorn(þ)到ANSI编码文件的解决方案
核心问题:选对编码
Windows系统里的「ANSI」不是固定编码,而是指当前系统默认代码页(比如中文环境是GBK),但Windows-1252、GBK这类编码本身不包含þ字符,这就是你转换后字符变样的根本原因。要正确保存þ,得用支持它的编码,比如ISO-8859-1(Latin-1)或者Windows-1250。
正确代码示例
假设你的原始字符串是UTF-8编码的þ(Netbeans默认UTF-8编码的话,直接写'þ'就是正确的UTF-8字节):
// 原始UTF-8格式的thorn字符 $thorn = 'þ'; // 转换为ISO-8859-1编码(该编码原生支持þ) $encoded_thorn = iconv('UTF-8', 'ISO-8859-1', $thorn); // 以二进制模式写入文件,避免换行符转换干扰 file_put_contents('thorn_file.txt', $encoded_thorn, FILE_BINARY);
解释你遇到的异常现象
- 用Windows-1252转换后þ变ţ:Windows-1252编码表中没有þ,iconv会自动替换成编码中最接近的字符(ţ的编码是0xCE),所以出现这个结果。
- utf8_encode("þ")变Ăľ:utf8_encode是把ISO-8859-1转成UTF-8,但你传入的þ本身已经是UTF-8了,相当于把UTF-8字节当成ISO-8859-1再转一次,自然乱码。
- Notepad++里的奇怪表现:
- PHP生成的文件是Windows-1252编码的ţ,复制到Notepad++的ANSI文件(比如GBK编码)时,GBK不支持ţ,所以被替换成t;
- 直接用Notepad转þ到ANSI,如果当前ANSI对应的编码不支持þ,就会变成?——这不是Notepad的bug,是编码本身的字符集限制,只有包含þ的编码才能正确保存它。
额外注意事项
- 确保Netbeans的PHP文件编码是UTF-8:在Netbeans中右键文件→属性,确认编码为UTF-8,这样字符串里的þ才是正确的UTF-8字节。
- 查看文件时手动选编码:用Notepad++打开生成的文件时,不要用默认的「ANSI」,而是选「编码」→「西欧字符」→「ISO-8859-1」,才能正确显示þ。
内容的提问来源于stack exchange,提问作者user2511599
相关产品推荐
相关产品推荐

