線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2564
推到 Plurk!
推到 Facebook!

欄位被編碼過,如何反推成原字串

答題得分者是:ddy
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-16 15:33:01 IP:61.220.xxx.xxx 未訂閱
客戶有一資料庫 裡面只要是中文名稱的部份都被程式編碼過 原則上它應有一個規則可循,反推回去成中文 比如: 昱--->?R 達--->1F 請問有人知道如何根據欄位字串反推回去的公式嗎? 謝謝 邱明昇
------
Thomas Chiou
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-16 16:42:26 IP:210.64.xxx.xxx 未訂閱
這種"編碼"是何因造成的?應是簡體-->繁體造成的吧? 可於簡體環境下將欄位名稱改以英文,再回繁體環境下改成中文 真的是被特殊程式保密造成的嗎?? (若是這樣…那這種保密還真是%#$@@&%~~) 除非知道編碼原則,不然無解 發表人 - ddy 於 2002/08/16 16:44:14
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-16 21:35:56 IP:61.220.xxx.xxx 未訂閱
不,我的意思是說欄位內的資料只要是中文部份都會是編碼過的 英文與數字倒沒有 所以我認為它是把一個中文字先折成低位元組與高位元組,在轉成 acssi 碼直接存入,問題我現在不知如何把一個中文字分成高低位元,以前好像看過是用 hi() 及 lo() 但我試了試它告訴我型態不對,如 hi('昱'),lo('昱') 如果可以的話再用 ord() 或 chr() 之類的轉成 ascii 碼 另外我以前看過一篇文章好像可從前後二個位元組判斷出是不是中文字,還是一般正常的 acsii 碼,好像是錢達智的文章,不過他的網站好像已關了,上不去 不知有人是否記得 邱明昇
------
Thomas Chiou
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-16 23:46:49 IP:61.59.xxx.xxx 未訂閱
參考這篇吧,可判斷出是否為中文字 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=20403 另將中文字分成高低位元如下:(lo / hi 接受的參數型態是integer,要先用ord)
var
    s:WideString;
    p:string;
    i:Integer;
begin
    p:='';
    s:='這是測試';
    for i:=0 to Length(s)-1 do
     p:= IntToStr(lo(ord(s[i])))   IntToStr(hi(ord(s[i]))) ;
end;
發表人 - ddy 於 2002/08/16 23:48:28
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-17 17:38:41 IP:61.220.xxx.xxx 未訂閱
謝謝你的熱心忙 問題已更接近解決的邊緣了 但我還是有些地方有點迷惑 比如說判斷是否為中文字串的範例中 for i:=1 to length(ws) do begin s:=s ws[i] ','; end; 為何起始條牛是 1 不是 0 另外我採用你教的方法去分解中文字的高低位元組得到的是 Var s:widestring; p:string; i:integer; begin p:=''; s:='昱'; for i:=0 to Length(s)-1 do p:= IntToStr(lo(ord(s[i]))) IntToStr(hi(ord(s[i]))) ; showmessage(P); end; 不論用那一個中文字得到的都是 00 widestring 這個型態的用法是否還有我該注意的方 再一次謝謝你熱心的幫忙 邱明昇
------
Thomas Chiou
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-18 17:47:28 IP:61.59.xxx.xxx 未訂閱
引言: for i:=1 to length(ws) do
index 由1開始的原因是index 0 是不使用的, index 0 在ShortString 裡是存放字串的長度 我覺得delphi是考量shortstring/ansistring/widestring的相容,所以第一個字才會從index 1開始
引言:
Var
s:widestring;
p:string;
i:integer;
begin
p:='';
s:='昱';
for i:=0 to Length(s)-1 do
p:= IntToStr(lo(ord(s[i])))  IntToStr(hi(ord(s[i]))) ;
showmessage(P);
end;
不論用那一個中文字得到的都是 00
Sorry 這個是我的疏忽 :p ( 唉~~vb在我心裡做怪>< ) 就如同上面所提的,index 0 是不用的,所以內容值是0 請把for i:=0 to Length(s)-1 do改成 for i:=1 to Length(s) do 即可^^ 噓~~~~~~沉思中… 發表人 - ddy 於 2002/08/18 17:48:20
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-08-21 09:52:23 IP:61.220.xxx.xxx 未訂閱
不好意思 果然被你猜中了 欄位資料是經過加密的 不易反推回去 不過還是收獲很大 因為學了很多基本觀念 謝謝 邱明昇
------
Thomas Chiou
系統時間:2024-04-26 5:20:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!