PB9和PB11 5字元處理例項

2021-06-25 13:54:40 字數 2820 閱讀 4483

pb9 是 ansi 的單位元組字符集版本,只能識別 ansi 標準中 ascii 碼範圍在 0~127 的字元,pb 直接將 ascii 碼等於 200 的字元交給作業系統,並告知該字元是乙個符合 ansi 標準的字元。作業系統就會使用 ansi 版本的中文字符集進行解釋(例如 gb2312);但由於中文是雙位元組字符集,無法轉換單個 ascii 碼為可顯示的符號,故以問號代替。

pb10 以上是 unicode 的多位元組字符集版本,可識別 utf8, utf16le(default), utf16be 字符集的字元,pb 先把 ascii 碼等於 200 的字元補足為兩位元組(形如 c8 00),然後再交給作業系統,並告知該字元是乙個符合 unicode(比如 utf16le)標準的字元,作業系統就會使用 unicode 版本的中文字符集進行解釋(例如 zhs16gbk);在雙位元組字符集中,高位位元組為 0, 低位位元組為 200 的字元是可顯示的符號。

char() 與 chara() 的差別在於讀取被轉換的字串或 blob 時,char() 讀取兩個位元組,而 chara() 只讀取乙個位元組,所以返回的結果乙個是 c8 00,乙個是 c8;但由於 messagebox() 會自動對 char 型別引數用 string() 進行轉換,也就是 messagebox("", string(chara(200))),所以 chara() 返回的 c8 實際上也被自動轉換為兩位元組後再傳給作業系統,故而顯示是一樣的結果。

ps: pb10 之後新增了一種位元組資料型別 byte,在需要操作 ansi 字符集的 blob 場合可以考慮使用。

pb9:

public function string pub_f_str_xor (string as_source);//public function pub_f_str_xor (string as_source) returns string 

//string as_source

long i

long ll_len1

long ll_len2

long ll_key

long ll_source

long ll_keychr

string ls_text

string as_key

as_key = "cntao"

ll_len1 = len(as_key)

for i = ll_len1 to 1 step -1 

ll_key[i] = asc(mid(as_key,i,1))

next 

ls_text = ""

ll_len2 = len(as_source)

for i = 1 to ll_len2 

ll_source = asc(mid(as_source,i,1))

ll_keychr = ll_key[1 + (mod(i - 1,ll_len1))]

ls_text = ls_text + char(256 + ll_keychr - ll_source)

next 

return ls_text

ansi 到 unicode 的最大問題在於 asc()函式,因為 ansi 字符集的 ascii 碼和 unicode 字符集的 ascii 碼除了 0~127 表示相同的字元外,其它的都不相同。所以對於 ascii 擴充套件字元或漢字,pb9 與之後的版本會取到完全不同的 ascii 碼。解決方法是按位元組而不是按字元取其 ascii 碼,但由於 asca() 無法轉換 ascii 碼大於 128 的 unicode 字元,因為在 ansi 中沒有對應編碼(不同國家對擴充套件 ascii 碼的定義不同),所以 asca() 基本上形同虛設!辦法是先把單位元組字元轉換為雙位元組字元,再用 asc() 直接讀出。

//public function pub_f_str_xor (string abl_source) returns string  

long i

long ll_len1

long ll_len2

long ll_key

long ll_source

long ll_keychr

blob lbl_source, lbl_text

blob lbl_word

// 兩個空位元組

byte lby_buf

string as_key

as_key = "cntao"

ll_len1 = lena(as_key)

for i = ll_len1 to 1 step -1

ll_key[i] = asca(mida(as_key, i, 1))

next

lbl_source = blob(as_source, encodingansi!)

lbl_text = lbl_source

// 初始化變數

ll_len2 = lena(lbl_source)

for i = 1 to ll_len2

lbl_word = blobmid(lbl_source, i, 1)

// 覆蓋第乙個位元組,第二個位元組保持為 0

ll_source = asc(char(lbl_word))

// 得到第乙個位元組的 ascii 碼 

ll_keychr = ll_key[1 + (mod(i - 1, ll_len1))]

setbyte(lbl_text, i, byte(256 + ll_keychr - ll_source))

next

//messagebox("pb12 [" + as_source + "]", "[" + string(lbl_text, encodingansi!) + "]")

return string(lbl_text, encodingansi!)

關於PB9按周取值

delete from ll temp commit ll num daysafter date rundate1 date rundate2 得到兩個日期區間有多少天 iii 1 ll date rundate1 ll num ll num 1 for i 1 to ll num step 1 i...

PB9阿里大於發簡訊

s sendunm 130123456789,138123456789 sms free sign name qqqq 審核通過的簽名 此 有乙個引數,如果簡訊模板不帶引數也能傳送成功 sms param name i time sms param value 11 sms template cod...

使用pb9呼叫webservices的注意事項

1.webservices使用c 開發,用pb9呼叫 2.object,dataset等等型別不能使用,如果使用了在解析wsdl的時候就過不了 3.如果能解析wsdl,選擇埠的時候選擇soap 4.匯入檔案pbsoapclient90.pbd,否則不能使用soapconnection 5.編譯生成s...