在PHP中读取重音字符的问题

时间:2009-04-14 13:42:15

标签: php encoding

在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会以它的方式显示...)

3 个答案:

答案 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代码页之间的区别:

http://en.wikipedia.org/wiki/Code_page_850

http://en.wikipedia.org/wiki/Windows-1252

答案 2 :(得分:-2)

重音可能被视为unicode数据,您必须将其存储。请查看utf_decodeutf_encodeiconv函数。

不等,它在ISO 8859-1字符集中。我不知道。您是否尝试过以二进制模式阅读或使用file_get_contents