如何在php中检测操作系统编码


How to detect operating system encoding in php?

我想检测一个操作系统的文件系统的默认编码,像Windows操作系统在不同的语言版本它会使用不同的编码(iso-8859-1, ms950, big5, gb2312等)那么如何检测PHP中编码的不同操作系统呢?任何想法?谢谢。

Linux没有编码,文件名存储在二进制字符串中,可以包含任何内容。用特定的编码来解释它取决于应用程序。大多数情况下,这只是UTF-8。但是,是的,这取决于文件名的"查看器"。

访问OS/X上的文件系统将使用UTF-8规范化格式d

不幸的是,我不能回答它在windows上是什么。在内部它是以UTF-16的变体形式存储的但在我的机器上通过PHP访问它的api是CP-1252,但这确实取决于语言。

为什么不使用mb_detect_encoding()?

Try

    print_r( explode(";", setlocale(LC_ALL, 0)));

然后需要将代码页转换为编码

文件系统没有一种编码,每个文件可以使用不同的编码,所以你所需要的就是找到一个正确的编码来处理文件名字符串。

要检测文件名的编码,您可以"尝试"将该文件名转换为所有已知的编码列表,并将原始文件名字符串与转换后的字符串进行比较,如果等于,则该编码就是您正在寻找的。

将字符串转换为我使用的一种编码方式。为了完成这项工作,您可以看到下面的示例代码:

function getActuallEncoding($text) {
    $encodingList = array('UTF-8', 'gb2312', 'ISO-8859-1', 'big5'); // Add more if you need.
    foreach($encodingList as $oneEncode) {
        $oneResult = iconv(mb_detect_encoding($text, mb_detect_order(), true), $oneEncode, $text);
        if(md5($oneResult) == md5($text)) return $oneEncode;
    }
    return "UNKNOWN"; // This return value may cause problem, just let you know.
}

希望对你有帮助。