我已经在网络上搜索,我已经通过SO看去,通过PHP文档等等。

这似乎是一个荒谬问题不具有标准溶液。如果您收到未知字符集,它有奇怪的字符(如英语引号),在那里将它们转换为UTF-8的标准方式?

我使用的功能过多和检查,并没有一个肯定会工作见过很多凌乱的解决方案。

有没有人拿出自己的功能或者是始终有效的解决方案?


修改

很多人回答说:“这是不可解”或类似这种事情。我明白了,但没有给予任何形式的解决方案,除了有其utf8_encode是非常有限的工作。有什么方法在那里为了解决这个问题?什么是 最好的方式?

有帮助吗?

解决方案

为什么你看到这么多复杂的方案来解决这个问题的原因是因为根据定义,它是不可解。编码的文本字符串的进程具有不确定性。 因此能够构造导致相同的字节流中的文本的不同组合和编码。因此,是不可能的,严格逻辑上说,为了确定编码,字符集,并从一个字节流中的文本。

在现实中,它是可能实现的结果是“足够接近”使用启发式方法,因为有一个有限集编码的,你会在野外遇到,并用足够大的样本程序可确定最有可能的编码。结果是否足够好取决于应用。

我想在用户生成的数据的问题评论。从网页上发布的所有数据具有已知的编码(开机自检附带了开发商已为页定义的编码)。如果用户文本粘贴到表单字段,浏览器将解释根据源数据的编码(由操作系统作为已知的)文本和页面的编码,并在必要时对其进行转码。这是为时已晚来检测编码的服务器上 - 因为浏览器可能已经修改基于假设的编码字节流。

例如,如果我在我的德国键盘上键入字母A并将其发布在UTF-8编码的页上,将有2个字节(XC3 X84)被发送到服务器。这是代表字母C和d有效的EBCDIC字符串。这也是代表了2个字符和一个有效的ANSI字符串“。它是,但是,不可能的,不管我怎么努力,粘贴的ANSI编码的字符串到浏览器的形式,并期望它被解释为UTF-8 - 因为操作系统知道我粘贴ANSI(我复制了从Textpad文本哪里创建的ANSI编码文本文件),并且将其转码为UTF-8,得到的字节流XC3 X83 X80 XE2 x9E。

我的观点是,如果用户设法张贴垃圾,这无疑是因为它已经是垃圾,在它被粘贴到浏览器表单的时间,因为客户没有对字符集,编码适当的支持, 随你。 由于字符编码是不确定性的,你不能指望有从这样的情况存在一个简单的方法揭开。

不幸的是,上载的文件的问题仍然存在。唯一可靠的解决方案,我看到的是通过一群不同的编码,以向用户示出文件的一部分,并询问是否被正确地解释,并循环,直到这种情况。

或者,我们可以开发一个启发式的方法,着眼于各种语言的某些字符的次数。说我上传包含两个字节XC3 X84我的文本文件。有没有其他的信息 - 在文件中只有两个字节。这种方法可以找出字母A是德语文本相当普遍,但字母A和“在一起是不常见的任何语言,从而判定我的文件的编码确实是UTF-8。这是连鳍鲑的复杂程度,这样的启发式方法来处理,而更多的统计和语言事实,它可以使用,更可靠的将其结果。

其他提示

没有。每个人都应该知道什么字符集的字符串是英寸猜测利用嗅探功能的字符集是不可靠的(虽然在大多数情况下,在西方世界,这是通常混淆ISO-8859-1和UTF-8之间)。

但是,为什么你要对付未知字符集?目前对此并没有通用的解决方案,因为不应该摆在首位存在的普遍问题。每个网页和数据源可以而且应该有一个字符集的定义,如果一个没有,一个应该请求资源的管理员添加一个。

(未声如自作聪明,但就是来处理这口井的唯一方式。)

佩卡是对有关不可靠,但如果你需要一个解决方案,并愿意承担风险,并且您有MBSTRING库中可用,这个段应工作:

function forceToUtf8($string) {
    if (!mb_check_encoding($string)) {
        return false;
    }
    return mb_convert_encoding($string, 'UTF-8', mb_detect_encoding($string));
} 

如果我没有错,有一些所谓的utf8encode ......它工作得很好,除非你已经在UTF8

http://php.net/manual/en/function.utf8 -encode.php

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top