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...