UTF-8编码检测失败特例
Posted myan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UTF-8编码检测失败特例相关的知识,希望对你有一定的参考价值。
Ruby中进行UTF-8编码检测的方法是String#unpack方法,传入 "U*" 模板。这个模板的意思是把字符串当成一个UTF-8串,分别把每一个Unicode字符转换成对应的代码点并组合为数组。字符串本身确实是UTF-8,则能够转换成功,否则将抛出异常。根据这种行为,给String添加如下实例方法:
class String
def utf8?
unpack('U*') rescue return false
true
end
end
以上程序在大部分情况下确实正确。但是我发现GB2312编码中,下列汉字的GB2312编码能够通过上面方法的检测,而被误认为是UTF-8串:
位、前、支、校、写、元
可能还有一些。因此,上述方法不适宜用来对可能包含GB2312编码的中文字串进行UTF-8编码检测。
注意这不是Ruby的问题,而是不同编码模式导致的本质难题。
可以做以下实验:
1. 打开notepad,写入一个‘位’字,不回车,直接以ANSI编码保存(注意必须用ANSI编码保存)。
2. 再次打开这个文件,你会看到显示出来的不是“位”字,而是λ。
同样,“前、支、校、写、元” 等单字也存在类似现象。
可见字符串编码检测并不容易。不知有没有什么可靠的方法(除了用Iconv库直试转以外),望知者不吝赐教。
class String
def utf8?
unpack('U*') rescue return false
true
end
end
以上程序在大部分情况下确实正确。但是我发现GB2312编码中,下列汉字的GB2312编码能够通过上面方法的检测,而被误认为是UTF-8串:
位、前、支、校、写、元
可能还有一些。因此,上述方法不适宜用来对可能包含GB2312编码的中文字串进行UTF-8编码检测。
注意这不是Ruby的问题,而是不同编码模式导致的本质难题。
可以做以下实验:
1. 打开notepad,写入一个‘位’字,不回车,直接以ANSI编码保存(注意必须用ANSI编码保存)。
2. 再次打开这个文件,你会看到显示出来的不是“位”字,而是λ。
同样,“前、支、校、写、元” 等单字也存在类似现象。
可见字符串编码检测并不容易。不知有没有什么可靠的方法(除了用Iconv库直试转以外),望知者不吝赐教。
以上是关于UTF-8编码检测失败特例的主要内容,如果未能解决你的问题,请参考以下文章
Java如何检测替换4个字节的utf-8编码(此范围编码包含emoji)