マルチバイト文字の混在した文字列から、固定のバイト数を切り出すには?

解決


初心者です  2004-07-30 22:13:05  No: 10154

1バイト文字とマルチバイト文字が混在した文字列から、
先頭の10バイト分を切り出したいと思っています。
10バイト目がちょうどマルチバイト文字であったら、
9バイト目で切るようにしたいです。
先頭から1文字ずつ取り出してバイト数を調べる、
という方法しか思いつきません。
スマートな方法があれば、ご教授ください。
宜しくお願いします。


Basser  2004-07-30 22:31:47  No: 10155

ヘルプでByteType関数を調べてみて下さい。


papillon  2004-07-30 23:41:38  No: 10156

私も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バイト以上の文字を知らないので^^;


papillon  2004-07-30 23:48:33  No: 10157

下のページの「Delphi Tips」というのが何かと役に立ちますよ^^
お互いがんばりましょう^^

http://www.wwlnk.com/boheme/


初心者です  2004-07-30 23:55:36  No: 10158

>Basser様
返答ありがとうございました。
ByteTypeで、切る場所の特定ができることがわかりました。

もう1つご教授ください。
Leftstr関数を使用すると、文字数で切り出してしまうのですが、
バイトで切り出すにはどうすれば良いでしょうか?
初歩的な質問で申し訳ありませんが、ご教授ください。
For文を使用して、特定したバイト数分の文字数をカウントするしかないですか?


初心者です  2004-07-30 23:59:57  No: 10159

>papillon様
返答ありがとうございました。
ご教授いただいた内容で試してみます!
ありがとうございました。


jok  2004-07-31 00:04:06  No: 10160

> バイトで切り出すにはどうすれば良いでしょうか?

Copy() がそれですけど。こんな感じ

procedure TForm1.Button1Click(Sender: TObject);
var
  s1,s2:string;
begin
  s1 := '123ああ456789012345678901234567890';
  s2 := Copy(s1,1,10);
  Label1.Caption := s2;
end;


jok  2004-07-31 00:08:31  No: 10161

最初の質問では

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;


Basser  2004-07-31 00:17:55  No: 10162

>Leftstr関数を使用すると、文字数で切り出してしまうのですが、
>バイトで切り出すにはどうすれば良いでしょうか?

私の環境はDelphi5なので、この関数を知らなかったのですが、
papillonさんが紹介されているページでは、
切り出しの単位がバイト数となっていますね?
もしそうでないなら、Copy関数を使用してみてはいかがでしょうか?


hiroron  2004-12-14 13:42:55  No: 10163

LeftStr 文字数
LeftBStr バイト数
ですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加