PB低版本下的UTF8字符编码转换

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


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值