标题: [技术讨论] [关于字符编码]GBK 和 UTF-8 之间的交集 [打印本页]
作者: PakTC 时间: 2014-1-11 23:28 标题: [关于字符编码]GBK 和 UTF-8 之间的交集
本帖最后由 PakTC 于 2014-1-11 23:59 编辑
今天PS版主不是说到不带BOM的UTF-8和 GBK编码区分么? 于是就准备着手写了。
先搜索一下,哟,Demon有一个VBS版的 区分 无BOM UTF-8 和GBK编码的脚本。
又翻了一下编码范围,还发现一些GBK的汉字对应的编码和UTF-8字符编码重合,
辨别起来还是要结合实际的。
那些能够互相吻合的编码,比如"\xC2\x80" 在UTF-8中是"", GBK中是"聙";
但是保存到文本里,用记事本打开,始终显示为 "" (保存到帖子里变成欧元字符了 )
(
也许notepad优先使用UTF-8编码识别,但是我们实际中还是更期望找到中文字符,
而不是特殊符号,这个时候统一码的汉字范围U+4E00 ~ U+9FFF可以作为很好的判
断依据。
)
参考:
链接:GBK编码和UTF-8编码的交集
字符数量少、信息单一的时候有一定几率出现混淆,比如上面的
"聙"(GBK/UTF-8: C2 80)。这个时候旁边加一个 "中"(仅GBK: d6 d0)
保存,记事本就能够正确识别为 “聙中”。
生成示例文本的代码:- open FH,">:raw","C280GBK_1.x";
- print FH "\xc2\x80";
- close FH;
-
- open FH,">:raw","C280GBK_2.x";
- print FH "\xc2\x80\xd6\xd0";
- close FH;
复制代码
其他代码过几天送上。
作者: PowerShell 时间: 2014-3-22 14:22
楼主闭关数月,所得如何?
不用头,如何区别ansi和utf-8编码文件啊?
我被你喷了,微软方案被你鄙视了,如今我找上门来了,你倒别跑啊 ...?
作者: PakTC 时间: 2014-3-25 19:46
楼主闭关数月,所得如何?
不用头,如何区别ansi和utf-8编码文件啊?
我被你喷了,微软方案被你鄙视了 ...
PowerShell 发表于 2014-3-22 14:22
哇,我好害怕啊,居然把某邪*版主喷了- use Encode;
- use Encode::Detect::CJK qw(detect);
-
- recogn("C280GBK_2.txt");
- recogn("C280UTF-8.txt");
-
- sub recogn {
- $file=shift;
- open READ,"<:raw",$file or die "Can not open file: $! ";
- $line=<READ>;
- print "Filename:", $file, " Code:",detect($line),"\n";
- close READ;
- }
复制代码
显示结果:
Filename:C280GBK_2.txt Code:cp936
Filename:C280UTF-8.txt Code:utf8
这结果和用WIN记事本识别的结果是一致的。
我所引用的帖子里,都说了一个观点,那就是UTF-8不需要加BOM,仅仅是说UTF-8。
问题在于GBK编码文本不加BOM,而UTF-8编码文本却加BOM。
(业界先有UTF-8,其他平台已经适应了不带BOM下进行区分。微软却独自加了BOM,而且还是三个字节,
导致了其他平台上读取的时候出错。这就是引用的帖子里批判的地方。)
两种编码之间存在交集,更大的问题在于,UTF-8的BOM ef bb bf 前两个字节可以识别为GBK "锘"
bf 加上 61 可以识别为GBK “縜”
一个带BOM的UTF-8编码文本保存了一行文字:abcdfef中文论坛
ef bb bf 61 62 63 64 66 65 66 e4 b8 ad e6 96 87 e8 ae ba e5 9d 9b
如果算法中使用GBK优先做识别,那这段字就可以按GBK编码为:
锘縜bcdfef涓枃璁哄潧
作者: PowerShell 时间: 2014-3-25 22:37
语无伦次+胡说八道+又臭又长。
论点在哪?论据如何?
通篇看不到你如何能区别编码。
我就知道你顾左右而言它,根本说不出来东西,看你帖子只是在浪费时间。
楼下看官看了你的帖子,能看出你说什么呢?谁说说,你3楼说出了什么论点论据?
像你这样胡乱堆积文字,写作文,凑数,对付老师,我小学就会了。
----------------------------------------------------------------
在我眼中,讨论 区分一个文本的编码,必须要有这么几个论点:
1 拿来一个文本,不告诉你编码,你是用什么方法区分的?效率如何,准确度如何?----总论点,纵观你帖子全篇,没一句说了这块。
1.1 分论点1,如何区分,一个文本是ansi?还是utf8?还是unicode编码?
1.2分论点2,如何区分,一个文本是哪种ansi编码。如这个文本是gb2312码?还是bi5码?
各国常见文本文件编码上百种,各自为政,不兼容多年。你就能准确区分?让人笑掉大牙。
-------------------------------------------------------------
还是哪句话,说不明白,要求,想法,目的,过程,的假大空文章,论文比比皆是,看之=浪费时间。
作者: DAIC 时间: 2014-3-25 23:00
回复 4# PowerShell
你有更好的Perl脚本的话,不妨拿出来分享一下。
作者: PakTC 时间: 2014-3-25 23:54
本帖最后由 PakTC 于 2014-3-26 00:00 编辑
回复 4# PowerShell
SB 就是 SB ,还敢跑出来装B,perl识别的代码就在那儿,示例文本也在那儿,同样的文本,你不敢亮个powershell识别的代码?
没代码你SAY A JB?给你点面子还得瑟的一B样。一看就是只会powershell的小学生。
作者: PowerShell 时间: 2014-3-26 11:59
你有更好的Perl脚本的话,不妨拿出来分享一下。
更好的Perl脚本?----1为什么要用脚本,而不用话语,中文语言?2为什么非用perl脚本。
每人都有特长的计算机语言,我不觉得会bat的都会perl。
perl识别的代码就在那儿,示例文本也在那儿-------------
1我不觉得所有论坛坛友都会perl,你会用代码和实例描述,而不会用语言(中文)描述?
2是不是不会perl,只会powershell的小学生,就不配和你讨论文件编码呢?
3文件编码问题是你跑到在bat版块嚷出来的,你不会忘了吧。要说【原初】,这根本不是你的话题啊。
--------------------------------------------------
结论:
1 拿来一个文本,不告诉你编码,你是用什么方法区分的?效率如何,准确度如何?----总论点,纵观你帖子全篇,没一句说了这块。
1.1 分论点1,如何区分,一个文本是ansi?还是utf8?还是unicode编码?
1.2分论点2,如何区分,一个文本是哪种ansi编码。如这个文本是gb2312码?还是bi5码?
上述根本问题,你从来避而不谈,你还SAY A JB?
-------------------------------------
另外告诉你个事实,根据我的最新测试,linux下的 一些个 文本编辑软件,也是支持bom头的,
也就是说,这些软件是,兼容+使用了 微软判断文件编码的方案的。
有空我整理出来,你也可以自己测试,这些都是铁的事实,而且不用会perl,只要会中文,都能看懂。
最后,我重申,微软发明的bom头及解决方案,和所有editor相关,和所有计算机语言相关。
不是说不会perl就不应该去懂,也不是说会perl,就高人一等。
本论坛中有讨论多种计算机语言,会点perl就屁颠了,就【大学生了!】,让人笑掉大牙!
作者: wskwfkbdn 时间: 2016-1-18 08:38
虽然是过去的帖子啦,我也出来扯蛋几句,utf8的编码和ansi的编码,除了半角字符完全一样,utf8全角一律比ansi全角字符多一个字节,utf8是3个字节的,ansi是2个字节,想准确的识别我有个方法已经实现了。
作者: codegay 时间: 2016-4-10 12:25
历史上的战争
作者: CrLf 时间: 2016-4-10 14:09
回复 9# codegay
碰到爱打仗的某人真是哭笑不得...
作者: codegay 时间: 2016-4-11 15:47
回复 10# CrLf
powershell才是世界上最好的语言!-_-!
作者: 523066680 时间: 2016-4-16 17:52
回复 11# codegay
=_= 他也就只能在脚本社区里面蹦跶了
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |