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字符集範圍其中1和2就是對應的gb2312字符集。分割槽 高位 低位<
----------------------------------------------
●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
如何讓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...