CVCode简繁转换的扩展:GBK与Big5转换

原创 2004年08月23日 21:56:00

  CVCode使用码表对照的方式实现简繁转换,在Unicode盛行的今天仍然是有其现实意义的。
  较常见的应用是,企业内有台籍员工,也有大陆员工,而且简体和繁体的OS都有使用,这样在MIS系统中如何保证GB2312、GBK、BIG5都能够正常使用,而且BIG5输入的资料在GBK的系统上要显示正常,并且能与GB2312中输入的字符相匹配(查询中,按名称查询是最常见的)。
  针对这样的应用,CVCode就提供码表对照的方式,理论上讲,只要定义好码表,就可以真正的让BIG5与GB2312“互通”

  但是在CVCode中,只是GB2312与BIG5转换,在GBK输入法流行的今天,GB2312显然不够了。而且BIG5字符集要远远大于GB2312,所以扩展CVCode使其具有GBK与BIG5转换功能势在必行。

  GBK的字符范围如下:

GBK字符集范围
分区                      高位     低位<
----------------------------------------------
●GBK/1:GB2312非汉字符号: A1~A9 || A1~FE
●GBK/2:GB2312汉字      : B0~F7 || A1~FE
●GBK/3:扩充汉字        : 81~A0 || 40~FE
●GBK/4:扩充汉字        : AA~FE || 40~A0
●GBK/5:扩充非汉字      : A8~A9 || 40~A0
其中1和2就是对应的GB2312字符集。

  如何让CVcode支持GBK,有3个问题:

    1.判断是否GB码
    2.计算字符顺序
    3.与原有码表兼容

第一个问题就要修改IsGB如下:

function isGB(value: string): Boolean;
Var
  mHigh, mLow : integer;
begin
  if (length(value)>=2) then
  begin
    mHigh := ord(value[1]);
    mLow := ord(value[2]);
    Result := False;
    //●GBK/1:GB2312非汉字符号: A1~A9 || A1~FE
    if (mHigh in [$A1..$A9]) and (mLow in [$A1..$FE]) then Result := True;
    //●GBK/2:GB2312汉字      : B0~F7 || A1~FE
    if (mHigh in [$B0..$F7]) and (mLow in [$A1..$FE]) then Result := True;
    //●GBK/3:扩充汉字        : 81~A0 || 40~FE
    if (mHigh in [$81..$A0]) and (mLow in [$40..$FE]) then Result := True;
    //●GBK/4:扩充汉字        : AA~FE || 40~A0
    if (mHigh in [$AA..$FE]) and (mLow in [$40..$A0]) then Result := True;
    //●GBK/5:扩充非汉字      : A8~A9 || 40~A0
    if (mHigh in [$A8..$A9]) and (mLow in [$40..$A0]) then Result := True;
  end
  else
    Result := true;
{  //这是原来的,只以GB2312为判断依据
  if (length(value)>=2) then
  begin
    if (value[1] <= #161) and (value[1] >= #247) then
      Result := false
    else
      if (value[2] <= #161) and (value[2] >= #254) then
        Result := false
      else
        Result := true
  end
  else
    Result := true;
    }
end;

第二个要计算顺序和与原有码表兼容---其实兼容主要也在顺序:
function GBOffset(value: string): integer;
Var
  mHigh, mLow : integer;
  mGBK1, mGBK2, mGBK3, mGBK4, mGBK5: integer;
begin
{ //这是原来的---
  if length(value) >= 2 then
    Result := (Ord(value[1]) - $A1) * $5E + (Ord(value[2]) - $A1)
  else
    Result := -1;
}
  Result := -1;
  if length(value) >= 2 then
  begin
    mHigh := ord(value[1]);
    mLow := ord(value[2]);
    //每个区都有多少个汉字?
    //mGBK1 := ($A9 - $A1 + 1) * ($FE - $A1 + 1);  // = 846 = $34E
    //mGBK2 := ($F7 - $B0 + 1) * ($FE - $A1 + 1);  // = 6768 = $1A70
    //mGBK3 := ($A0 - $81 + 1) * ($FE - $40 + 1);
    //mGBK4 := ($FE - $AA + 1) * ($A0 - $40 + 1);
    //mGBK5 := ($A9 - $A8 + 1) * ($A0 - $40 + 1);
    mGBK1 := $34E;  //846
    mGBK1 := mGBK1 + ($B0 - $A9-1) * ($FE - $A1 + 1);   //这个是为了和以前的码表兼容
    mGBK2 := $1A70;  //6768
    mGBK3 := $17E0;  //6112
    mGBK4 := $2035;  //8245
    mGBK5 := $C2;  //194
    //●GBK/1:GB2312非汉字符号: A1~A9 || A1~FE
    if (mHigh in [$A1..$A9]) and (mLow in [$A1..$FE]) then
      Result := (mHigh - $A1) * ($FE - $A1 + 1) + (mLow - $A1)
    //●GBK/2:GB2312汉字      : B0~F7 || A1~FE
    else if (mHigh in [$B0..$F7]) and (mLow in [$A1..$FE]) then
      Result := mGBK1 +
                (mHigh - $B0) * ($FE - $A1 + 1) + (mLow - $A1)
    //●GBK/3:扩充汉字        : 81~A0 || 40~FE
    else if (mHigh in [$81..$A0]) and (mLow in [$40..$FE]) then
      Result := mGBK1 + mGBK2 +
                (mHigh - $81) * ($FE - $40 + 1) + (mLow - $40)
    //●GBK/4:扩充汉字        : AA~FE || 40~A0
    else if (mHigh in [$AA..$FE]) and (mLow in [$40..$A0]) then
      Result := mGBK1 + mGBK2 + mGBK3 +
                (mHigh - $AA) * ($A0 - $40 + 1) + (mLow - $40)
    //●GBK/5:扩充非汉字      : A8~A9 || 40~A0
    else if (mHigh in [$A8..$A9]) and (mLow in [$40..$A0]) then
      Result := mGBK1 + mGBK2 + mGBK3 + mGBK4 + 
                (mHigh - $A8) * ($A0 - $40 + 1) + (mLow - $40);
  end
end;

使用iconv进行GBK到BIG5编码转/简繁转换遇到的问题

Linux操作系统中的iconv命令/函数可以将一种已知的字符集文件转换成另一种已知的字符集文件。 在使用它进行GBK到BIG5的编码转换时,遇到"iconv:illeagal input seque...
  • littlefang
  • littlefang
  • 2015年02月27日 10:56
  • 3879

PHP类UTF8编码内的繁简转换-繁体-简体

均只支持 UTF8 文本,所以如果获得的来源是  $_GET 的话, 就有必要转换一下编码了。用到的函数是: Java代码   $str = $_GET['str'];   ...
  • Meseal
  • Meseal
  • 2016年06月23日 15:51
  • 7622

用C语言实现常见的三种中文内码转换

用C语言实现常见的三种中文内码转换    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要...
  • xjbclz
  • xjbclz
  • 2016年06月29日 22:48
  • 1409

简繁文字转换小软件BIG5ToGB2312

  • 2010年01月28日 23:26
  • 707KB
  • 下载

utf8 gbk big5 多编码批量转换软件

  • 2011年02月17日 17:24
  • 819KB
  • 下载

GBK,GB2312,BIG5内码转换

  • 2016年01月08日 10:48
  • 38KB
  • 下载

VC中三种常见中文内码的转换方法(GB2312/GBK/BIG5)

我们平时常见的三种中文内码是:GB2312(简体中文)、GBK、BIG5(繁体中文)。网上有很多中文内码的专用转换工具。我们碰到由于内码不一致而导致的乱麻问题,用这些工具可以进行相互转换。但论坛里经常...
  • LewenSky
  • LewenSky
  • 2011年01月24日 11:15
  • 599

boost库学习随记五 Boost.Locale 之字符转换 gbk utf8 big5 string wstring等

 std::string boost::locale::conv::between ( char const *  begin,     char c...
  • leitianjun
  • leitianjun
  • 2014年04月28日 18:43
  • 13270

Boost.Locale 之字符转换 gbk utf8 big5 string wstring等

Boost.Locale是一个库,它提供高质量的本地化的设施在C + +的方式。它最初是设计的一部分CppCMS - C + +的Web框架的项目,然后促成了提升。 Boost.Locale提供强大...
  • gong_xucheng
  • gong_xucheng
  • 2014年05月16日 10:09
  • 4976

Perl中简体字转换为繁体字(GBK转换成big5)

今天用Perl解决了一个转码出现乱码的问题。需求是将gbk转换成big5.项目源码用的函数是decode()和encode()两个函数。源码如下: #!/usr/bin/perl use stri...
  • haoweilaizoule
  • haoweilaizoule
  • 2016年07月15日 17:22
  • 737
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CVCode简繁转换的扩展:GBK与Big5转换
举报原因:
原因补充:

(最多只允许输入30个字)