文字列が正規かの判定を教えて下さい。

解決


ようた  2012-11-28 04:06:54  No: 43422

いつもお世話になっています、文字列に関する質問です。

例えば以下の様なプログラムがあったとします・・・。

procedure TFa1main.Button1Click(Sender: TObject);
var
  s :String;
begin
  s :='東京';
  showmessage(Copy(s,1,1));
end;

文字列sを表示すると当然「東」の半分表示なので文字として認識しませんがエラーにはなりません。これをエラーと判定する方法、又は関数はありませんでしょうか?

宜しくお願いします。


DEKO  2012-11-28 05:47:39  No: 43423

こんにちは。

SysUtils.IsLeadChar
SysUtils.ByteType
SysUtils.StrByteType

この辺りの関数で判定できますが、
Shift_JIS では 1 バイト目と 2 バイト目の範囲が重複している事があるので、
先頭から順に調べるか、前後の文字も調べる必要があります。

# 提示されたコードは Delphi 2009 以降の場合 '東' を表示します。
# お使いの Delphi のバージョンを明示するようにしてください。


古いDelphiなら  2012-11-28 07:40:59  No: 43424

s :WideString;で
質問が半分表示における単なる例ならば忘れてください


ようた  2012-11-29 02:31:13  No: 43425

DEKOさん、有難う御座います。

Delphiのバージョンはかなり前の6です。

SysUtils.IsLeadChar
SysUtils.ByteType
SysUtils.StrByteType

は使えるでしょうか>


Mr.XRAY  2012-11-29 03:28:47  No: 43426

こんにちは,

>は使えるでしょうか>

これがもし,Delphi 6 にある関数類なのか.ということでしたら.簡単です.
ソースコードを検索してみることです.
僭越ではありますが,調べてみました.

SysUtils.IsLeadChar   // Delphi 2007 以降にあり.Delphi 6 にはなし
SysUtils.ByteType     // Delphi 6 にあり
SysUtils.StrByteType  // Delphi 6 にあり


DEKO  2012-11-29 05:12:59  No: 43427

Delphi 6 という事で。

function IsValidCP932String(S: AnsiString; Index: Integer; Count: Integer): Boolean;
begin
  result := False;
  // 開始位置/終了位置が不正なら無効
  if (Index <= 0) or (Count <= 0) then
    Exit;
  // 開始位置のエレメントがマルチバイト文字の 2 バイト目なら無効
  if ByteType(S, Index) = mbTrailByte then
    Exit;
  // 終了位置のエレメントがマルチバイト文字の 1 バイト目なら無効
  if ByteType(S, Index+Count-1) = mbLeadByte then
    Exit;
  result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
  i, l: Integer;
begin
  S := '東京';
  i := 1; // インデックス
  l := 1; // 長さ
  ShowMessage(Copy(S, i, l));
{
  // S に切り取った後の文字列を入れてはいけない
  // (判定に失敗するケースが存在する)
  S := '集計表';
  S := Copy(S, 6, 1);
  ShowMessage(S);
  i := 1;         // インデックス
  l := Length(S); // 長さ
}
  // 有効/無効を判定する
  if IsValidCP932String(S, i, l) then
    ShowMessage('有効')
  else
    ShowMessage('無効');
end;


ようた  2012-11-29 20:42:35  No: 43428

DEKOさん、丁寧なサンプルプウログラム有難う御座います。お陰様で成功しました。その他のみなさんも有難う御座いました。バンザイ!


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

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






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