[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 发表于 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

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

回复 4# PowerShell


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

TOP

返回列表