请问如何判断一个字符串末尾一个字符是否是半个汉字,并把它去掉??或者说是如何判断一个字符串末尾一个字符是否正常!?!?
解决方案 »
- 使用 business skin form 皮肤控件开发程序, 如何使弹出式窗体仍然有相同的风格?
- 请问delphi中如何获得一个复数的实部或虚部?谢谢各位!
- 如何用delphi操作winrar文件
- 我的小程序想有xp风格界面,但是不知道怎么样实现
- 开发一个发EMAIL系统,主要把一些数据直接发出去,不用复制到OUTLOOKEXPRESS中。有什么好的控件推荐
- 公司要告我?!来看看提点建议!!3X!
- 初级问题
- 小妹求助~一个很菜的问题 UP 有分^*^
- 再问一个关于TMEMO的问题
- 用KeyDown事件怎样检测到在键盘上按方向键(左)、方向键(右)、方向键(上)、方向键(下)?
- 一个简单而肤浅的问题,大家近来看看吧!
- 帮忙看一下这个字段求合问题,提问者有点菜.
S:String;
begin
if Ord(RightStr(S,1)[1])>128 then
S:=LeftStr(S,Length(S)-1);
end;
-------------------------------------------------------------------------------- [INLINE] 如何截剪中文字串,而不会出现乱码Q:
各位先进!!
我尝试将一个长字串,内含中文字及半形字,截剪成固定长度的字串如何能
避免截剪到中文字,而出现乱码?A:
[INLINE]
您可以参考本信举出的例子, 重点在於切出来的字串, 如何判定其最後一个
字元是否是一个中文字的前半字.
我采用的是从头检视到最後的演算法, 也许有人会怀疑 --
[INLINE] 1. 为什麽不直接抓最後一个字元判断? 因为中文字的
Trail-byte, 其内码也可能落在 Lead-byte 的内码区间内.
[INLINE] 2. 为什麽不直接抓最後两个字元来判断? 因为前一个字的
Trail-byte 加上後一个字的 Lead-byte, 可能又是一个中文字.
以上的考虑是基於DelphiChat以前讨论过「判断一个字是否为 BIG-5 中文字
?」的讨论, 判断时的采用的方法与可能的问题我在此就不重覆了, 请大家
自行参阅.
如果是 Win3.1, 11/25 robin <[email protected]>曾发表笔划计算函数,
其中的中文字判断不是用 IsDBCSLeadByte, 而是检查内码区间, 也一并建议
给您参考. (下载 Robin 的笔划计算函数)
[INLINE] 1. 在 form 上放置两个 TMemo 元件, 一个 TButton
[INLINE] 2. Button1 的 OnClick 事件.
procedure TForm1.Button1Click(Sender: TObject);
const
_LengthPerLine = 6;
var
i: integer;
sLine: string;
sCuted: string;
iCutLength: integer;
j: integer;
bIsDBCS: boolean;
begin
if _LengthPerLine < 2 then Exit;
Memo2.Lines.Clear; for i := 0 to Memo1.Lines.Count - 1 do
begin
sLine := Memo1.Lines[i];
if Length(sLine) = 0 then // 如果是空行的话
Memo2.Lines.Add(#13+#10)
else
repeat
// 截出 _LengthPerLine 个字元出来
iCutLength := _LengthPerLine;
sCuted := Copy(sLine, 1, iCutLength);
iCutLength := Length(sCuted);
bIsDBCS := False;
// 看看最後一个字元是不是中文的前半个字
for j := 1 to iCutLength do
begin
if bIsDBCS then
bIsDBCS := False
else
if Windows.IsDBCSLeadByte(byte(sCuted[j])) then
bIsDBCS := True;
end;
// 如果最後一个字是中文的话, 少截一个字元
if bIsDBCS then Dec(iCutLength);
// 截出确定长度的字元并加入 Memo2 中
Memo2.Lines.Add(Copy(sLine, 1, iCutLength));
// 从 sLine 中去掉已送至 Memo2 的文字.
sLine := Copy(sLine, iCutLength + 1, Length(sLine) - iCutLength);
until Length(sLine) <= 0;
end;
end;
TheWideChar:wideString;
TheChar:String;
FirstHalfChar,Secondhalfchar:String;
begin
//先把你需要判断的字符取到变量TheWideChar中,类型WideString用来防止取到半个字符
TheChar:=TheWidechar;
FirstHalfChar:=TheChar[1];//将前半个字节给变量FirstHalfChar
SecondHalfChar:=TheChar[2];
if ord(FirsthalfChar[1])>=161 then //因为汉字编码第一个字节从A1,也就是十进制的161开始,第二个字节也是从A1开始编码的(我指的是GB2312字符集,而GBK或Big5等不是这个编码范围)
begin
showmessage('汉字');
end
else
begin
showmessage('不是汉字');
end;
end;
ismbbtrail
ismbblead
ismbcl0
ismbcl1
ismbcl2