【问题标题】:opendir and readdir returns utf8opendir 和 readdir 返回 utf8
【发布时间】:2016-06-21 09:34:27
【问题描述】:

为什么这会在一台服务器上返回 utf8 字符而不在另一台服务器上返回?一些文件名包含 unicode 字符,例如 æ øå..

在某些环境中会打印 utf8 字符,而在某些环境中会打印 iso 字符

header('content-type: text/plain');
$handle = opendir("./dir");
while($readdir = readdir($handle)){
    echo "$readdir\n";
}

输出Content-Type:text/plain;charset=UTF-8

Retursvar 2 med fejl p� debiteringsniveau.xml
Retursvar 2 med fejl på debiteringsniveau.xml

两个系统上安装相同的语言环境 (UTF8)

dpkg-reconfigure locales

【问题讨论】:

  • 正在使用什么底层文件系统?返回不同结果的服务器上使用的文件系统是否相同?
  • 所有系统都是 Debian Jessie - 相同的发行版
  • 好的,下一个问题 - 你如何设置 Content-Type。我假设您正在通过网络服务器运行并在浏览器中查看?内容类型是通过'header()'还是内联html设置的??
  • 它在header().. 页面被视为纯文本
  • 您错误地循环了目录,而不是 while($readdir = readdir($handle)){ echo "$readdir\n"; } 它应该是:while (false !== ($entry = readdir($handle))) { echo "$entry\n"; },如 readdir() 函数文档 here 中所述。这不会解决您当前的问题,它可能会阻止您的项目稍后发生。

标签: php directory filesystems


【解决方案1】:

您可能会发现您的网络服务器在每个系统的不同区域设置下运行。

要确定这一点,请通过您的网络服务器运行以下 php:

<?php
system("locale");

返回正确字符的网络服务器可能是在“utf8”语言环境或“C”环境中运行。

网络服务器使用的语言环境可以设置在不同的地方。通过使用系统范围的语言环境 - 或特定于服务的语言环境。您可能需要调查任何差异的原因,并决定是更新系统范围的语言环境还是只更新网络服务器。

在 Debian 上,系统范围的语言环境更改可以使用

dpkg-reconfigure locales

并按照提示进行操作。

或者,对于特定于服务的语言环境。在启动服务之前,将“LANG”环境变量设置为您在服务初始化脚本中需要的变量。您可能还可以搜索一个特定于服务的配置文件,以在网络服务器升级时保留更改。

【讨论】:

  • 两个系统上都安装了完全相同的语言环境。都是 UTF8
  • 澄清一下 - 系统区域设置可能与网络服务器或任何其他进程正在运行的区域不同。您使用什么方法来确定两个网络服务器都以 UTF-8 运行?
【解决方案2】:

这不是 PHP 问题,而是系统问题。问题可能源于其中一个系统上的区域设置错误。如果您运行locale,您可以检查当前安装了哪些语言环境。如果语言环境未标记为 UTF-8,这将是您的问题。安装正确的 UTF-8 语言环境将解决此问题。

【讨论】:

  • 两个系统上都安装了完全相同的语言环境。都是 UTF8
【解决方案3】:

尝试在您的标头中设置 utf-8 编码:

header('content-type: text/plain; charset:utf-8');

【讨论】:

    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2021-05-16
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多