全角/半角/英数/大文字小文字 まじり文の「あいまい検索


YS  2025-11-06 09:58:51  No: 152192

いつも大変参考にさせていただいており有難うございます。

現在環境 Delphi Xe8 VCL Firebird2.5 FireDAC
Firebird データベースの文字コードを CP943C から UTF8 に移行を試行しています。
(FBconverterを使用して、CP943CからUTF8に変更は成功)
CP943C では 全角/半角/英数/大文字小文字 まじり文の「あいまい検索」をおこなっていました。

以下は現在の 「あいまい検索」CODE です。
procedure TMainForm.GetHinnmeiKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Key := #0;
if MainForm.GetHinnmei.Text <> ''  then
begin
////////////////////////
Mainorm.HinnmeiKensaku;/////////////////////////
end;
//endif
end;
//endif
end;

procedure TMainForm.HinnmeiKensaku;
var
Chr : array [0..255]  of  char;
begin
MainForm.GetHinnmei.Text := Trim(AnsiUpperCase(MainForm.GetHinnmei.Text));

//■全角を半角に変換する
Windows.LCMapString(
GetUserDefaultLCID(),
LCMAP_HALFWIDTH,
PChar(MainForm.GetHinnmei.Text),        //変換する文字列
Length(MainForm.GetHinnmei.Text) + 1,   //サイズ
chr,                      //変換結果
Sizeof(chr)               //サイズ
);
MainForm.GetHinnmei.Text :=  Chr;


if MainForm.GetHinnmei.Text <> '' then
begin

//***************************************************************************
DM.FDHacchuMnQry.Close;
DM.FDHacchuMnQry.SQL.Clear;

DM.FDHacchuMnQry.SQL.Add('SELECT * FROM HacchuMn                      ');
DM.FDHacchuMnQry.SQL.Add('WHERE (Upper(Hinnmei) Like :Hinnmei)        ');

DM.FDHacchuMnQry.ParamByName('Hinnmei').AsWideString := '%'+AnsiUpperCase(Trim
(MainForm.GetHinnmei.Text))+'%';

DM.FDHacchuMnQry.Open;
//****************************************************************************

if not DM.FDHacchuMnQry.Eof then
MainForm.DBGrid1.SetFocus;
//endif

end
//endif
end;


しかし
Chr : array [0..255]  of  char; を    Chr : array [0..255]  of  Widechar;
MainForm.GetHinnmei.Text := Trim(AnsiUpperCase(MainForm.GetHinnmei.Text));を   Trim(UpperCase
(MainForm.GetHinnmei.Text))

上記を変更してみましたが「半角英数のみ」ならば大文字/小文字検索はできるのですが「全角まじり文」では
 検索できません。
pCharが理解できていません。
UTF-8「全角まじり文」でも検索できるを方法等ございましたら教えてください。


mam  URL  2025-11-07 09:07:07  No: 152193

半角大文字変換を行いたいと言うことでしょうか。

//半角大文字変換
function ChangeHalfUpperCase(SrcStr:String):String;
var Buf:array of Char;
begin
  Result:='';
  if SrcStr='' then exit;

  SetLength(Buf,Length(SrcStr)+1);
  LCMapStringEx(
    LOCALE_NAME_SYSTEM_DEFAULT,
    LCMAP_HALFWIDTH or LCMAP_UPPERCASE,
    PChar(SrcStr),Length(SrcStr),
    PChar(@Buf[0]),Length(Buf),
    nil,nil,0
  );
  Result:=PChar(Buf);
end;

//使用例
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(
    ChangeHalfUpperCase('abcde0123FgHijk45')
  );
end;

外していたらすいません。
参考URL:
https://mam-mam.net/delphi/vcl_lcmapstring.html


YS  2025-11-07 11:41:06  No: 152194

いつも大変お世話になります。
mam様 早速回答ありがとうございます。
例 カメラ で検索を行い  カメラ、カメラ 両方検索したいです。
現在 cp943cでは使用出来ておりUTF8にしたら検索漏れがある状態です。
上記mam様 内容 確認試してみます。
もうしばらくお待ちください。


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

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







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