CVCode簡繁轉換的擴充套件 GBK與Big5轉換

2021-09-30 02:59:02 字數 3634 閱讀 6717

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;

endelse

result := true;

end;

第二個要計算順序和與原有碼表相容---其實相容主要也在順序:

function gboffset(value: string): integer;

var mhigh, mlow : integer;

mgbk1, mgbk2, mgbk3, mgbk4, mgbk5: integer;

begin

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);

endend;

簡繁轉換如此簡單

public function strconv byval str as string,byval conversion as microsoft.visualbasic.vbstrconv,optional byval localeid as integer 0 as string 成員屬於 mi...

HanLP極致簡繁轉換

談起簡繁轉換,許多人以為是小意思,按字轉換就行了。事實上,漢語歷史悠久,地域複雜,發展至今在字元級別存在 一簡對多繁 和 一繁對多簡 在詞語級別上存在 簡繁分歧詞 在港澳台等地則存在 字詞習慣不同 的情況。為此,hanlp新增了 簡體 繁體 台灣正體 香港繁體 間的相互轉換功能,力圖將簡繁轉換做到極...

MSSQL SQL簡繁轉換函式

全部的簡繁對照 生成碼表 create table codetable gb nchar 1 big nchar 1 select top 1298 id identity int,1,1 into t from syscolumns a,syscolumns binsert codetablese...