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

取得字串儲存長度

答題得分者是:brook
blue
中階會員


發表:114
回覆:105
積分:58
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2017-10-03 08:46:46 IP:122.146.xxx.xxx 未訂閱
Hi,各位先進大家好:
Tw_Str := '金山詞霸';
CN_Str := '金山词霸';
Label1.Caption := IntToStr(Length(AnsiString(Tw_Str)));
Label2.Caption := IntToStr(Length(AnsiString(CN_Str)));
如以上Code,繁體字取得的值是8,但簡體字取得的是7,Why?
謝謝!
it1506
初階會員


發表:30
回覆:83
積分:47
註冊:2011-02-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2017-10-12 09:47:13 IP:59.120.xxx.xxx 未訂閱
編碼問題吧

你用showmessage

簡體show出來的應該是 金山?霸

那個問號佔 1
其它3字佔 2
2 2 1 2=7
max5020
資深會員


發表:26
回覆:275
積分:320
註冊:2003-06-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2017-10-20 11:41:29 IP:59.125.xxx.xxx 未訂閱
因為強制轉換AnsiString(UNICODE_STRING), 
會依系統預設語文編碼轉換,
因此繁中可順利轉為 AnsiString(8-Bytes),
但簡中就轉錯了, 所以變成7碼
pcplayer99
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2017-10-24 13:13:41 IP:120.237.xxx.xxx 未訂閱
你要这个长度来干什么?

在 Unicode 系统里面,直接这样转换没有意义。要转换,用 TEncoding.Convert 或者 TEncoding 的类似方法。但实际上这个长度,并不是真正的 Byte 数。
blue
中階會員


發表:114
回覆:105
積分:58
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2017-10-30 16:12:10 IP:125.227.xxx.xxx 未訂閱
Hi,感謝 Max5020及Pcplayer99先進的指導:
小弟最主要問題是因為要列印報表(因沒有標準格式,只能用 PrinterCanvas輸出,
偏偏客戶要的字型英/中並非1/2字寬....(好像一般字也是),但卻要對齊,
只能一個字一個字輸出,所以需要知道輸出的字所佔的"寬"度,
謝謝!

===================引 用 pcplayer99 文 章===================
你要这个长度来干什么?

在 Unicode 系统里面,直接这样转换没有意义。要转换,用 TEncoding.Convert 或者 TEncoding 的类似方法。但实际上这个长度,并不是真正的 Byte 数。
brook
資深會員


發表:56
回覆:322
積分:370
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2017-11-09 10:17:26 IP:220.128.xxx.xxx 未訂閱
這個問題也困擾了我很久,還是覺得用中文字的第一字元大於127的方式比較正確.


[code cpp]
請在此區域輸入程式碼
//Unicode長度幾個Bytes
int GetBytesOfUnicodeString(UnicodeString uu)
{
// return ByteLength(uu);

// return AnsiString(uu).Length();

/*
//"上?指?";
int rc = 0;
HDC c = CreateDC("DISPLAY", "", "", NULL);
if (c)
{
TCanvas *a = new TCanvas();
if (a)
{
a->Handle = c;
a->Font->Name="Courier";
rc = a->TextWidth(uu)/a->TextWidth("A");
delete a;
}
DeleteDC(c);
}
return rc;
*/

int rc = 0;
for (int i = 1; i <= uu.Length(); i++)
{
if (uu[i] > 127) rc += 2;
else rc++;
}
return rc;
}

[/code]
編輯記錄
brook 重新編輯於 2017-11-09 10:19:57, 註解 無‧
brook 重新編輯於 2017-11-14 16:02:15, 註解 無‧
系統時間:2017-11-20 11:58:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!