1バイト文字とマルチバイト文字が混在した文字列から、
先頭の10バイト分を切り出したいと思っています。
10バイト目がちょうどマルチバイト文字であったら、
9バイト目で切るようにしたいです。
先頭から1文字ずつ取り出してバイト数を調べる、
という方法しか思いつきません。
スマートな方法があれば、ご教授ください。
宜しくお願いします。
ヘルプでByteType関数を調べてみて下さい。
私もdelphiを始めたばかりです 参考になればいいですけど^^;
procedure TForm1.Button1Click(Sender: TObject);
var
Str, Temp: String;
i, j: Integer;
Arr: array of String;
begin
Str := Edit1.Text;
if Length(Edit1.Text) >= 10 then
begin
{
10バイト以上の文字列の処理。
}
// 動的配列Arrの要素数。
SetLength(Arr, Length(Edit1.Text));
for i := 1 to Length(Str) do
begin
case ByteType(Str, i) of
mbSingleByte: Arr[i-1] := '半角'; // 半角
mbLeadByte : Arr[i-1] := '全角1'; // 全角の1バイト目
mbTrailByte : Arr[i-1] := '全角2'; // 全角の2バイト目
end;
end;
if (Arr[9] = '半角') or (Arr[9] = '全角2') then
begin
// 10バイト目が半角または、全角2の処理。
for j := 1 to 10 do
begin
Temp := Temp + Edit1.Text[j];
end;
end
else begin
// 10バイト目が全角1の処理。
for j := 1 to 9 do
begin
Temp := Temp + Edit1.Text[j];
end;
end;
Edit2.Text := Temp;
end
else begin
{
10バイト未満の文字列の処理。
}
Edit2.Text := Edit1.Text;
end;
end;
※2バイト文字までしか考えていません。
3バイト以上の文字を知らないので^^;
下のページの「Delphi Tips」というのが何かと役に立ちますよ^^
お互いがんばりましょう^^
>Basser様
返答ありがとうございました。
ByteTypeで、切る場所の特定ができることがわかりました。
もう1つご教授ください。
Leftstr関数を使用すると、文字数で切り出してしまうのですが、
バイトで切り出すにはどうすれば良いでしょうか?
初歩的な質問で申し訳ありませんが、ご教授ください。
For文を使用して、特定したバイト数分の文字数をカウントするしかないですか?
>papillon様
返答ありがとうございました。
ご教授いただいた内容で試してみます!
ありがとうございました。
> バイトで切り出すにはどうすれば良いでしょうか?
Copy() がそれですけど。こんな感じ
procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2:string;
begin
s1 := '123ああ456789012345678901234567890';
s2 := Copy(s1,1,10);
Label1.Caption := s2;
end;
最初の質問では
procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2:string;
begin
s1 := '12345678ああ9012345678901234567890';
case ByteType(s1,10) of
mbSingleByte,mbTrailByte: s2 := Copy(s1,1,10);
mbLeadByte : s2 := Copy(s1,1,9);
end;
Label1.Caption := s2;
end;
>Leftstr関数を使用すると、文字数で切り出してしまうのですが、
>バイトで切り出すにはどうすれば良いでしょうか?
私の環境はDelphi5なので、この関数を知らなかったのですが、
papillonさんが紹介されているページでは、
切り出しの単位がバイト数となっていますね?
もしそうでないなら、Copy関数を使用してみてはいかがでしょうか?
LeftStr 文字数
LeftBStr バイト数
ですね。
ツイート | ![]() |