在PHP领域遇到了一个奇怪的问题。这是一个精简的例子:
$handle = fopen("file.txt", "r");
while (($line = fgets($handle)) !== FALSE) {
echo $line;
}
fclose($handle);
例如,如果我有一个如下所示的文件:
Lucien Frégis
然后上面的代码从命令行运行输出相同的名称,但不是e急性我得到:
Lucien FrÚgis
查看文件的十六进制转储,我看到有问题的字节是E9,这是我在php的默认编码(ISO-8859-1)中所期望的,通过输出default_charset的当前值来确认
有什么想法吗?
编辑:
正如所建议的那样,我已经检查了windows代码页,显然是850,这已经过时了(但是解释了为什么0xE9会以它的方式显示...)
答案 0 :(得分:2)
0xE9
是iso-8859-1中é的编码。它也是同一角色的unicode代码点。如果您的控制台以不同的编码(例如cp-850)解释输出,则相同的字节将转换为不同的代码点,从而在屏幕上显示不同的字符。如果您查看the code page for cp-850,您会发现字节0xE9
转换为Ú(Unicode代码点0xDA
)。所以基本上你的控制台错误地解释了字节。我不知道怎么做,但是你应该把控制台的字符集更改为iso-8859-1。
答案 1 :(得分:0)
在命令行上运行php之前,请尝试执行命令:
chcp 1252
这会将代码页更改为重音字符所在的位置。
请参阅以下链接,了解850和1252代码页之间的区别:
答案 2 :(得分:-2)
重音可能被视为unicode数据,您必须将其存储。请查看utf_decode
,utf_encode
和iconv
函数。
不等,它在ISO 8859-1字符集中。我不知道。您是否尝试过以二进制模式阅读或使用file_get_contents
?