to_utf8
功能:将ANSI编码字符串转为UTF8编码字节流
语法:to_utf8(s, buf)
参数:s string 传入ANSI编码的字符串
buf blob 返回UTF8编码的字节流
返回值 long UTF8编码的字节流长度
测试待编码字符串:PB低版本下的UTF8字符编码转换
n_func_charset ln_charset
string ls_ansi
blob lblb_utf8
ls_ansi = 'PB低版本下的UTF8字符编码转换'
ln_charset.to_utf8(ls_ansi, lblb_utf8)
return 0
UTF8编码下,一个中文字符占3字节,一个ASCII字符占1字节,因此最后编码的UTF8字节流共39字节。
from_utf8
功能:将UTF8编码字节流转为ANSI编码字符串
语法:from_utf8(buf, s)
参数:buf blob 传入UTF8编码的字节流
s string 返回ANSI编码的字符串
返回值 long ANSI编码的字符串字节长度
测试将前面编码的UTF8字节流解码
n_func_charset ln_charset
string ls_ansi
blob lblb_utf8
long ll_utf8_length
ls_ansi = 'PB低版本下的UTF8字符编码转换'
ll_utf8_length = ln_charset.to_utf8(ls_ansi, lblb_utf8)
string ls_ansi_new
long ll_ansi_length
ll_ansi_length = ln_charset.from_utf8(lblb_utf8, ls_ansi_new)
return 0
中文系统中的ANSI编码下,一个中文字符占2字节,一个ASCII字符占1字节,因此最后解码的ANSI字符串共28字节。
源代码
发现BUG请留言或私信,以便修正(QQ:768310524 TEL:18649713925)
forward
global type n_func_charset from nonvisualobject
end type
end forward
global type n_func_charset from nonvisualobject autoinstantiate
end type
type prototypes
private:
FUNCTION long WideCharToMultiByte(uint CodePage, ulong dwFlags, ref blob lpWideCharStr, long cchWideChar, ref blob lpMultiByteStr, long cbMultiByte, long lpDefaultChar,long lpUsedDefaultChar) Library "kernel32.dll"
FUNCTION long MultiByteToWideChar(uint CodePage, ulong dwFlags, ref blob lpMultiByteStr,long cchMultiByte,ref blob lpWideCharStr, long cchWideChar) LIBRARY "kernel32.dll"
end prototypes
type variables
private:
CONSTANT UINT CP_UTF8 = 65001
CONSTANT UINT CP_ACP = 0
end variables
forward prototypes
public function long from_utf8 (blob buf, ref string s)
public function long to_utf8 (string s, ref blob buf)
end prototypes
public function long from_utf8 (blob buf, ref string s);blob lblb_unicode
blob{2} b0
long ll_size_unicode, ll_size_utf8
if isnull(buf) then return -1
if len(buf) <= 0 then return 0
ll_size_utf8 = len(buf)
ll_size_unicode = 2 * MultiByteToWideChar(CP_UTF8, 0, buf, ll_size_utf8, lblb_unicode, 0)
lblb_unicode = blob(space(ll_size_unicode))
lblb_unicode = lblb_unicode + b0
MultiByteToWideChar(CP_UTF8, 0, buf, ll_size_utf8, lblb_unicode, ll_size_unicode)
s = FromUnicode(lblb_unicode)
return len(s)
end function
public function long to_utf8 (string s, ref blob buf);blob lblb_unicode, lblb_utf8
long ll_size_unicode, ll_size_utf8
if isnull(s) then return -1
if len(s) <= 0 then return 0
lblb_unicode = ToUnicode(s)
ll_size_unicode = len(lblb_unicode) / 2
ll_size_utf8 = WideCharToMultiByte(CP_UTF8, 0, lblb_unicode, ll_size_unicode, lblb_utf8, 0, 0, 0)
lblb_utf8 = blob(space(ll_size_utf8))
ll_size_utf8 = WideCharToMultiByte(CP_UTF8, 0, lblb_unicode, ll_size_unicode, lblb_utf8, ll_size_utf8, 0, 0)
buf = lblb_utf8
return ll_size_utf8
end function
on n_func_charset.create
call super::create
TriggerEvent( this, "constructor" )
end on
on n_func_charset.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on