309 lines
7.5 KiB
Plaintext
309 lines
7.5 KiB
Plaintext
$PBExportHeader$n_cst_unicode_cvt.sru
|
||
forward
|
||
global type n_cst_unicode_cvt from nonvisualobject
|
||
end type
|
||
end forward
|
||
|
||
global type n_cst_unicode_cvt from nonvisualobject autoinstantiate
|
||
end type
|
||
|
||
type prototypes
|
||
Function int WideCharToMultiByte(uint CodePage, ulong dwFlags, ref char lpWideCharStr[], int cchWideChar, ref string lpMultiByteStr, int cbMultiByte,ref string lpDefaultChar,ref boolean lpUsedDefaultChar) Library "KERNEL32.DLL"
|
||
FUNCTION int MultiByteToWideChar(uint CodePage, ulong dwFlags, ref string lpMultiByteStr,int cchMultiByte,ref char lpWideCharStr[], int cchWideChar) LIBRARY "kernel32.dll" ALIAS FOR "MultiByteToWideChar"
|
||
|
||
FUNCTION ulong LCMapString(ulong Locale,ulong dwMapFlags,ref string lpSrcStr,ulong cchSrc,ref string lpDestStr,ulong cchDest) LIBRARY "kernel32.dll" ALIAS FOR "LCMapStringA"
|
||
|
||
|
||
end prototypes
|
||
type variables
|
||
constant long CP_ACP = 0 // default to ANSI code page
|
||
constant long CP_UTF8 = 65001 // default to UTF-8 code page
|
||
constant long MB_PRECOMPOSED = 1
|
||
end variables
|
||
forward prototypes
|
||
public function string of_jt_2_ft (string src)
|
||
public function string of_gb_to_unicode (string as_source)
|
||
public function string of_unicode_to_gb (string as_source)
|
||
public function string of_unicode_to_utf8 (string as)
|
||
private function string of_dec2hex (long al)
|
||
private function long of_hex2dec (string as)
|
||
public function string of_uft8_to_unicode (string as)
|
||
public function string of_hex2bin (string s_hex)
|
||
public function string of_bin2hex (string s_binary)
|
||
public function string of_gb_to_utf8 (string as)
|
||
end prototypes
|
||
|
||
public function string of_jt_2_ft (string src);//Constant long LCMAP_TRADITIONAL_CHINESE=67108864
|
||
//Constant long LCMAP_SIMPLIFIED_CHINESE=33554432
|
||
//
|
||
string ls_target,ls_src
|
||
//string sn
|
||
//ulong un
|
||
//blob lb_blob
|
||
//long ll_len
|
||
//
|
||
//ls_src=src
|
||
//
|
||
//ll_len=len(ls_src)*2+1
|
||
//
|
||
//ls_target=space(ll_len)
|
||
//
|
||
//setnull(sn)
|
||
//setnull(un)
|
||
//
|
||
//LCMapString(2052,LCMAP_TRADITIONAL_CHINESE,ls_src,-1,ls_target,ll_len)
|
||
//MultiByteToWideChar (936, 0, ls_target, -1, lb_blob,ll_len)
|
||
//WideCharToMultiByte (950, 0, lb_blob, -1, ls_target,ll_len, sn,un)
|
||
|
||
return ls_target
|
||
|
||
|
||
end function
|
||
|
||
public function string of_gb_to_unicode (string as_source);//gb2312→unicode
|
||
STRING ls_Ret,ls_NULL,ls_tmp
|
||
Char lc_Data[]
|
||
LONG ll_Count,ll_Index,ll_Pos,ll_Len
|
||
BOOLEAN lb_UseDefault = FALSE
|
||
SetNULL(ls_NULL)
|
||
ls_tmp = lc_Data
|
||
|
||
//首先获取转换后返回串的长度
|
||
ll_Len = lenw(as_source) * 2
|
||
//分配空间
|
||
lc_Data = Space(ll_Len)
|
||
//获取转换后返回串内容
|
||
MultiByteToWideChar(936,0,as_source,-1,lc_Data,ll_Len)
|
||
//MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,as_source,-1,lc_Data,ll_Len)
|
||
ll_count = upperbound(lc_Data)
|
||
if mod(ll_count, 2) <> 0 then return ''
|
||
for ll_index = 1 to ll_count step 2
|
||
ls_Ret += (of_dec2hex(asc(lc_data[ll_index + 1])) + of_dec2hex(asc(lc_data[ll_index])))
|
||
next
|
||
RETURN ls_Ret
|
||
|
||
end function
|
||
|
||
public function string of_unicode_to_gb (string as_source);//unicode→gb2312
|
||
STRING ls_Ret,ls_NULL,ls_tmp
|
||
Char lc_Data[]
|
||
LONG ll_Count,ll_Index,ll_Pos,ll_Len
|
||
BOOLEAN lb_UseDefault = FALSE
|
||
ll_Count = Len(as_Source) / 2
|
||
FOR ll_Index = 1 TO ll_Count
|
||
IF ll_Index / 2 = INT(ll_Index / 2) THEN
|
||
ll_Pos = ll_Index - 1
|
||
ELSE
|
||
ll_Pos = ll_Index + 1
|
||
END IF
|
||
lc_Data[ll_Pos] = Char(of_hex2dec(Mid(as_Source,(ll_Index - 1) * 2 + 1,2)))
|
||
NEXT
|
||
lc_Data[ll_Index + 1] = Char(0)
|
||
SetNULL(ls_NULL)
|
||
ls_tmp = lc_Data
|
||
|
||
//首先获取转换后返回串的长度
|
||
ll_Len = WideCharToMultiByte(936,0,lc_Data,-1,ls_NULL,0,ls_NULL,lb_UseDefault)
|
||
|
||
//分配空间
|
||
ls_Ret = Space(ll_Len)
|
||
//获取转换后返回串内容
|
||
WideCharToMultiByte(936,0,lc_Data,-1,ls_Ret,ll_Len,ls_NULL,lb_UseDefault)
|
||
|
||
RETURN ls_Ret
|
||
|
||
end function
|
||
|
||
public function string of_unicode_to_utf8 (string as);//unicode→utf8
|
||
|
||
/*
|
||
Unicode编码(16进制) UTF-8 字节流(二进制)
|
||
0000 - 007F 0xxxxxxx
|
||
0080 - 07FF 110xxxxx 10xxxxxx
|
||
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
|
||
*/
|
||
string ls, ls_sub, ls_utf
|
||
int i, j
|
||
long ll
|
||
ll = len(as)
|
||
for i = 1 to ll step 4
|
||
ls_sub = mid(as, i, 4)
|
||
choose case ls_sub
|
||
case '0000' to '007F'
|
||
ls_sub = '0' + right('000000' + of_hex2bin( ls_sub), 7)
|
||
case '0080' to '07FF'
|
||
ls_sub = right('0000000000' + of_hex2bin( ls_sub), 11)
|
||
ls_sub = '110' + left(ls_sub, 5) + '10' + right(ls_sub,6)
|
||
case else //'0800' to 'FFFF'
|
||
ls_sub = right('0000000000000000' + of_hex2bin( ls_sub), 16)
|
||
ls_sub = '1110' + left(ls_sub, 4) + '10' + mid(ls_sub,5, 6) + '10' + mid(ls_sub, 11, 6)
|
||
end choose
|
||
for j = 1 to len(ls_sub) step 8
|
||
ls += '%' + of_bin2hex(mid(ls_sub, j, 4)) + of_bin2hex(mid(ls_sub, j + 4, 4))
|
||
next
|
||
next
|
||
|
||
return ls
|
||
end function
|
||
|
||
private function string of_dec2hex (long al);long l,m,n
|
||
string ls ,a
|
||
if al = 0 then return '00'
|
||
l = al
|
||
do while l > 0
|
||
m = mod(l ,16 )
|
||
l = Truncate((l/16),0)
|
||
if m < 10 then
|
||
a = string(m)
|
||
else
|
||
a = char(m + 55)
|
||
end if
|
||
ls = a + ls
|
||
loop
|
||
return ls
|
||
end function
|
||
|
||
private function long of_hex2dec (string as);long j,k,l,m,n
|
||
string ls
|
||
as = upper(as)
|
||
for j = 1 to len(as)
|
||
ls = mid(as,(len(as) - j +1 ),1)
|
||
choose case ls
|
||
case 'A','B','C','D','E','F'
|
||
l = asc(ls) - 55
|
||
case else
|
||
l = long(ls)
|
||
end choose
|
||
m = 16^(j - 1)
|
||
n += m * l
|
||
next
|
||
|
||
return n
|
||
|
||
end function
|
||
|
||
public function string of_uft8_to_unicode (string as);//utf8→unicode
|
||
string ls
|
||
/*
|
||
Unicode编码(16进制) UTF-8 字节流(二进制)
|
||
0000 - 007F 0xxxxxxx
|
||
0080 - 07FF 110xxxxx 10xxxxxx
|
||
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
|
||
*/
|
||
|
||
return ls
|
||
end function
|
||
|
||
public function string of_hex2bin (string s_hex);//16进制→2进制
|
||
|
||
string s_bin, s_return, s_tmp
|
||
int i
|
||
|
||
for i = 1 to len(s_hex)
|
||
s_tmp = mid(s_hex, i, 1)
|
||
choose case s_tmp
|
||
case "0"
|
||
s_return += "0000"
|
||
case "1"
|
||
s_return += "0001"
|
||
case "2"
|
||
s_return += "0010"
|
||
case "3"
|
||
s_return += "0011"
|
||
case "4"
|
||
s_return += "0100"
|
||
case "5"
|
||
s_return += "0101"
|
||
case "6"
|
||
s_return += "0110"
|
||
case "7"
|
||
s_return += "0111"
|
||
case "8"
|
||
s_return += "1000"
|
||
case "9"
|
||
s_return += "1001"
|
||
case "A"
|
||
s_return += "1010"
|
||
case "B"
|
||
s_return += "1011"
|
||
case "C"
|
||
s_return += "1100"
|
||
case "D"
|
||
s_return += "1101"
|
||
case "E"
|
||
s_return += "1110"
|
||
case "F"
|
||
s_return += "1111"
|
||
case else
|
||
|
||
end choose
|
||
next
|
||
|
||
return s_return
|
||
|
||
end function
|
||
|
||
public function string of_bin2hex (string s_binary);//2进制→16进制
|
||
|
||
string s_bin, s_return, s_tmp
|
||
int i
|
||
|
||
for i = 1 to len(s_binary) step 4
|
||
s_tmp = mid(s_binary, i, 4)
|
||
choose case s_tmp
|
||
case "0000"
|
||
s_return += "0"
|
||
case "0001"
|
||
s_return += "1"
|
||
case "0010"
|
||
s_return += "2"
|
||
case "0011"
|
||
s_return += "3"
|
||
case "0100"
|
||
s_return += "4"
|
||
case "0101"
|
||
s_return += "5"
|
||
case "0110"
|
||
s_return += "6"
|
||
case "0111"
|
||
s_return += "7"
|
||
case "1000"
|
||
s_return += "8"
|
||
case "1001"
|
||
s_return += "9"
|
||
case "1010"
|
||
s_return += "A"
|
||
case "1011"
|
||
s_return += "B"
|
||
case "1100"
|
||
s_return += "C"
|
||
case "1101"
|
||
s_return += "D"
|
||
case "1110"
|
||
s_return += "E"
|
||
case "1111"
|
||
s_return += "F"
|
||
case else
|
||
|
||
end choose
|
||
next
|
||
|
||
return s_return
|
||
|
||
end function
|
||
|
||
public function string of_gb_to_utf8 (string as);//gb2312→unicode→utf8
|
||
return of_unicode_to_utf8( of_gb_to_unicode( as))
|
||
end function
|
||
|
||
on n_cst_unicode_cvt.create
|
||
call super::create
|
||
TriggerEvent( this, "constructor" )
|
||
end on
|
||
|
||
on n_cst_unicode_cvt.destroy
|
||
TriggerEvent( this, "destructor" )
|
||
call super::destroy
|
||
end on
|
||
|