Ker*_*nes 4 php utf-8 iso-8859-1 character-encoding special-characters
我浏览过网页,通过PHP文档等等,我已经看过了.
没有标准的解决方案似乎是一个荒谬的问题.如果您收到未知字符集,它有奇怪的字符(如英语引号),在那里将它们转换为UTF-8的标准方式?
我已经看到许多混乱的解决方案使用了大量的功能和检查,但它们都不会发挥作用.
有没有人提出自己的功能或总是有效的解决方案?
编辑
许多人回答说"这是不可解决的"或类似的东西.我现在明白了,但是没有人提供任何有效的解决方案,除此之外utf8_encode
非常有限.有什么方法可以解决这个问题?什么是最好的方法?
Pek*_*ica 11
不应该总是知道字符串是什么字符集.使用嗅探函数猜测字符集是不可靠的(尽管在大多数情况下,在西方世界,它通常是ISO-8859-1和UTF之间的混淆-8).
但为什么你必须处理未知的字符集?对此没有通用的解决方案,因为一般问题不应该存在.每个网页和数据源可以而且应该有一个字符集的定义,如果一个没有,一个应该请求资源的管理员添加一个.
(听起来不像是智能手机,但这是解决这个问题的唯一方法.)
你为这个问题看到了这么多复杂的解决方案的原因是因为根据定义它是不可解决的.编码一串文本的过程是非确定性的.可以构造导致相同字节流的文本和编码的不同组合.因此,严格地说,从字节流中确定编码,字符集和文本是不可能的.
在现实中,它是可能实现的结果是"足够接近"使用启发式方法,因为有一组有限的,你会在野外遇到编码的,并有足够的大样本程序能够确定最可能的编码.结果是否足够好取决于应用程序.
我想对用户生成数据的问题发表评论.从网页发布的所有数据都具有已知编码(POST附带开发人员为页面定义的编码).如果用户将文本粘贴到表单字段中,则浏览器将基于源数据的编码(如操作系统所知)和页面编码来解释文本,并在必要时对其进行转码.检测服务器上的编码为时已晚 - 因为浏览器可能已根据假定的编码修改了字节流.
举例来说,如果我在我的德国键盘上键入字母A并将其发布在UTF-8编码的页面上,将有2个字节(XC3 X84)发送到服务器.这是一个有效的EBCDIC字符串,表示字母C和d.这也是一个有效的ANSI字符串,代表2个字符Ã和".它是,但是,不可能的,不管我怎么努力,粘贴的ANSI编码的字符串到浏览器的形式,并期望它被解释为UTF-8 - 因为操作系统知道我粘贴ANSI(我复制了从Textpad文本哪里创建的ANSI编码文本文件),并且将其转码为UTF-8,导致字节流XC3 X83 X80 XE2 x9E.
我的观点是,如果用户设法张贴垃圾,这无疑是因为它已经是垃圾,在它被粘贴到浏览器表单的时间,因为客户没有对字符集,编码,任何适当的支持.因为字符编码是非确定性的,所以你不能指望存在一种从这种情况中发现的简单方法.
不幸的是,对于上传的文件问题仍然存在 我看到的唯一可靠的解决方案是向用户显示文件的一部分,并询问它是否被正确解释,并循环通过一堆不同的编码,直到这种情况.
或者我们可以开发一种启发式方法,查看各种语言中某些字符的出现.假设我上传了包含两个字节xC3 x84的文本文件.没有其他信息 - 文件中只有两个字节.这种方法可以发现字母Ä在德语文本中相当常见,但字母"和"在任何语言中都不常见,因此确定我的文件的编码确实是UTF-8.这种粗糙是这种启发式方法必须处理的复杂程度,它可以使用的统计和语言事实越多,其结果就越可靠.
归档时间: |
|
查看次数: |
783 次 |
最近记录: |