いつもお世話になっています、文字列に関する質問です。
例えば以下の様なプログラムがあったとします・・・。
procedure TFa1main.Button1Click(Sender: TObject);
var
s :String;
begin
s :='東京';
showmessage(Copy(s,1,1));
end;
文字列sを表示すると当然「東」の半分表示なので文字として認識しませんがエラーにはなりません。これをエラーと判定する方法、又は関数はありませんでしょうか?
宜しくお願いします。
こんにちは。
SysUtils.IsLeadChar
SysUtils.ByteType
SysUtils.StrByteType
この辺りの関数で判定できますが、
Shift_JIS では 1 バイト目と 2 バイト目の範囲が重複している事があるので、
先頭から順に調べるか、前後の文字も調べる必要があります。
# 提示されたコードは Delphi 2009 以降の場合 '東' を表示します。
# お使いの Delphi のバージョンを明示するようにしてください。
s :WideString;で
質問が半分表示における単なる例ならば忘れてください
DEKOさん、有難う御座います。
Delphiのバージョンはかなり前の6です。
SysUtils.IsLeadChar
SysUtils.ByteType
SysUtils.StrByteType
は使えるでしょうか>
こんにちは,
>は使えるでしょうか>
これがもし,Delphi 6 にある関数類なのか.ということでしたら.簡単です.
ソースコードを検索してみることです.
僭越ではありますが,調べてみました.
SysUtils.IsLeadChar // Delphi 2007 以降にあり.Delphi 6 にはなし
SysUtils.ByteType // Delphi 6 にあり
SysUtils.StrByteType // Delphi 6 にあり
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;
DEKOさん、丁寧なサンプルプウログラム有難う御座います。お陰様で成功しました。その他のみなさんも有難う御座いました。バンザイ!
ツイート | ![]() |