[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[技术讨论] [关于字符编码]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)
保存,记事本就能够正确识别为 “聙中”。

生成示例文本的代码:
  1. open FH,">:raw","C280GBK_1.x";
  2. print FH "\xc2\x80";
  3. close FH;
  4. open FH,">:raw","C280GBK_2.x";
  5. print FH "\xc2\x80\xd6\xd0";
  6. close FH;
复制代码
其他代码过几天送上。
Press Any Key To Continue...

楼主闭关数月,所得如何?

不用头,如何区别ansi和utf-8编码文件啊?

我被你喷了,微软方案被你鄙视了,如今我找上门来了,你倒别跑啊 ...?
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

楼主闭关数月,所得如何?

不用头,如何区别ansi和utf-8编码文件啊?

我被你喷了,微软方案被你鄙视了 ...
PowerShell 发表于 2014-3-22 14:22



哇,我好害怕啊,居然把某邪*版主喷了
  1. use Encode;
  2. use Encode::Detect::CJK qw(detect);
  3. recogn("C280GBK_2.txt");
  4. recogn("C280UTF-8.txt");
  5. sub recogn {
  6.     $file=shift;
  7.     open READ,"<:raw",$file or die "Can not open file: $! ";
  8.     $line=<READ>;
  9.     print "Filename:", $file, " Code:",detect($line),"\n";
  10.     close READ;
  11. }
复制代码
显示结果:
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涓枃璁哄潧
Press Any Key To Continue...

TOP

语无伦次+胡说八道+又臭又长。

论点在哪?论据如何?
通篇看不到你如何能区别编码。

我就知道你顾左右而言它,根本说不出来东西,看你帖子只是在浪费时间。

楼下看官看了你的帖子,能看出你说什么呢?谁说说,你3楼说出了什么论点论据?

像你这样胡乱堆积文字,写作文,凑数,对付老师,我小学就会了。
----------------------------------------------------------------
在我眼中,讨论 区分一个文本的编码,必须要有这么几个论点:
1 拿来一个文本,不告诉你编码,你是用什么方法区分的?效率如何,准确度如何?----总论点,纵观你帖子全篇,没一句说了这块。

1.1 分论点1,如何区分,一个文本是ansi?还是utf8?还是unicode编码?
1.2分论点2,如何区分,一个文本是哪种ansi编码。如这个文本是gb2312码?还是bi5码?

各国常见文本文件编码上百种,各自为政,不兼容多年。你就能准确区分?让人笑掉大牙。

-------------------------------------------------------------
还是哪句话,说不明白,要求,想法,目的,过程,的假大空文章,论文比比皆是,看之=浪费时间。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 4# PowerShell


    你有更好的Perl脚本的话,不妨拿出来分享一下。

TOP

本帖最后由 PakTC 于 2014-3-26 00:00 编辑

回复 4# PowerShell


    SB 就是 SB ,还敢跑出来装B,perl识别的代码就在那儿,示例文本也在那儿,同样的文本,你不敢亮个powershell识别的代码?
没代码你SAY A JB?给你点面子还得瑟的一B样。一看就是只会powershell的小学生。
Press Any Key To Continue...

TOP

你有更好的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就屁颠了,就【大学生了!】,让人笑掉大牙!
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

虽然是过去的帖子啦,我也出来扯蛋几句,utf8的编码和ansi的编码,除了半角字符完全一样,utf8全角一律比ansi全角字符多一个字节,utf8是3个字节的,ansi是2个字节,想准确的识别我有个方法已经实现了。

TOP

历史上的战争
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 9# codegay


    碰到爱打仗的某人真是哭笑不得...

TOP

回复 10# CrLf

powershell才是世界上最好的语言!-_-!
   
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 11# codegay


    =_= 他也就只能在脚本社区里面蹦跶了

TOP

返回列表