全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4004
推到 Plurk!
推到 Facebook!

LowerCase 對於中文字

答題得分者是:John Wong
雪貓
一般會員


發表:4
回覆:12
積分:3
註冊:2006-08-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-31 17:57:23 IP:220.132.xxx.xxx 訂閱
Win 2000 . D7
我有中英文字混雜的字串
內文判斷時.英文字必須轉為小寫
但是
LowerCase("各位請等一下") 會變成 守位請等一工
若是這樣.那就表示.還會有其他中文字經過 LowerCase 時.會變
請問
是我的問題?.還是BUG?
有沒有辦法解決?
雪貓
一般會員


發表:4
回覆:12
積分:3
註冊:2006-08-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-31 19:07:58 IP:220.132.xxx.xxx 訂閱
目前我只能先用如下的方法.暫時頂著用
將英文字,逐字替換
For A := 65 to 90 do
memo1.Text :=StringReplace(memo1.Text,chr(A),chr(A 32),[rfReplaceAll]);


Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-31 20:14:51 IP:211.22.xxx.xxx 未訂閱
這樣如何!只要不是雙字組都可以置換,不限定只有英文字。
procedure TForm1.Button1Click(Sender: TObject);
Var
i: Integer;
aString:String;
TempString:String;
begin
TempString := '';
aString := '各A位B請C等C一E下';
i := 1;
while true do
begin
if Windows.IsDBCSLeadByte(Byte(aString[i])) then
begin
TempString := TempString MidBStr(aString,i,2);
Inc(i,2);
end
else
begin
TempString := TempString LowerCase(MidBStr(aString,i,1));
Inc(i);
end;
if ( i >= Length(aString) ) then
break;
end;
ShowMessage(TempString);
end;
雪貓
一般會員


發表:4
回覆:12
積分:3
註冊:2006-08-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-01-31 21:01:12 IP:220.132.xxx.xxx 訂閱
Stallion 您好
您的這個方式.看起來也是逐字檢查
若萬一....我有一整篇文章置於 memo裡.那麼似乎會花更多的時間來做檢查轉換
但是...至少比我的方法好太多.先試著用..謝謝
但不知 LowerCase 或 UpperCase 是否對中文字(或雙字碼)無法全部支援?
LowerCase 或 UpperCase 不是應該只針對英文字母作大小寫轉換嬤?
或許可能要問Borland才知道了^^
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-01-31 21:17:56 IP:211.22.xxx.xxx 未訂閱
如果沒記錯,Borland的VCL是不支援Unicode的!除非你改用Borland的DotNet版本。
另外有關英文字母大小寫之前純屬筆誤,哈~請參考!
===================引 用 文 章===================
Stallion您好
您的這個方式.看起來也是逐字檢查若萬一....我有一整篇文章置於 memo裡.那麼似乎會花更多的時間來做檢查轉換
但是...至少比我的方法好太多.先試著用..謝謝
但不知 LowerCase 或UpperCase 是否對中文字(或雙字碼)無法全部支援?
LowerCase 或UpperCase 不是應該只針對英文字母作大小寫轉換嬤?

或許可能要問Borland才知道了^^
John Wong
初階會員


發表:1
回覆:35
積分:32
註冊:2004-09-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-02-01 00:27:03 IP:219.77.xxx.xxx 未訂閱
轉用AnsiLowerCase.
Unit
SysUtils
Category
string handling routines
function AnsiLowerCase(const S: string): string;
Description
AnsiLowerCase returns a string that is a copy of the given string converted to lower case. The conversion uses the current locale. This function supports multi-byte character sets (MBCS).
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-02-01 09:08:46 IP:210.241.xxx.xxx 未訂閱
各 => 0xA6 0x55
0xA6 不是英文字
0x55 => U
LowerCase('U') => u => 0x75
0xA6 0x75 => 守

如果你確定只有中英文字, 不會有特殊符號
先抓第一個 byte 如果大於 'z' , 表示為中文字, 第二個 byte 忽略不要轉換
如果第一個 byte 小於 'z', 就不是中文字, 轉換

程式大略如此 (小弟沒有實際測試)
Skip:=False;
for i:=0 to Length(String1)-1 do
begin
if Skip=False then // 這個沒有忽略, 是要檢查的
if String1[i]>'z' then
Skip:=True
else
String1[i]=LowerCase(String1[i]);
else
Skip=False; // 這個已經忽略, 下個要檢查
end;

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
雪貓
一般會員


發表:4
回覆:12
積分:3
註冊:2006-08-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-02-01 10:22:29 IP:220.132.xxx.xxx 訂閱
所以逐字檢查是目前最好的方法.?
但是..若是幾個字,或百十字以下.那還好.萬一是整篇文章..逐字檢查似乎會很耗效能.
John Wong 大 提供的 AnsiLowerCase 目前使用起來.是OK的
包含全形半形的符號,也還不會變樣
大家參考看看
我也還在多測試這個指令試試^^
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-02-01 11:01:06 IP:61.219.xxx.xxx 未訂閱
使用 開發工具提供的 API ( AnsiLowerCase ) 該是最好最快的方式了
要調整效能, 要從程式寫法 (例如用 Stream 比 Memo1 快, ...), Compile 最佳化 (速度最佳化), ... 等地方著手
或者您願意將 Source Code 壓縮上傳, 讓大家看看如何加速
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2017-10-23 3:09:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!