文字列を半角全角カタカナひらがな大文字小文字変換 ~Delphiソースコード集
文字列を「カタカナ」「ひらがな」「大文字」「小文字」「全角」「半角」に変換するにはLCMapStringEx関数を使います。
(LCMapString関数を使っても良いのですが非推奨のようです)
LCMapStringEx(
LOCALE_NAME_SYSTEM_DEFAULT,
変換フラグ,
PChar(変換前文字列), 変換前文字列長さ,
PChar(変換後文字列バッファ), 変換後文字列バッファの長さ,
nil, nil, 0
);
変換フラグは以下の組み合わせ等が指定可能です
詳細は https://learn.microsoft.com/ja-jp/windows/win32/api/winnls/nf-winnls-lcmapstringex を参照
- LCMAP_FULLWIDTH
- 全角に変換
- LCMAP_HALFWIDTH
- 半角に変換
- LCMAP_HIRAGANA
- ひらがなに変換
- LCMAP_KATAKANA
- カタカナに変換
- LCMAP_UPPERCASE
- 大文字に変換
- LCMAP_LOWERCASE
- 小文字に変換
プロジェクトの新規作成と画面設計
ファイル→新規作成→Windows VCLアプリケーションをクリックし、
空のアプリケーションを選択してOKボタンを押してプロジェクトを作成します。
TButtonとTMemoをフォームにドラッグ&ドロップします。

ソースコードの記述
「Button1」をダブルクリックしてソースコードを記述します。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var s,d:String; buf:array of char; begin //わかりやすくするためにフォントを変更 Memo1.Font.Name:='MS ゴシック'; Memo1.Font.Size:=16; Memo1.Clear; Memo1.ScrollBars:=ssBoth; //変換前文字 s:='"abcABCカナカナひらがな##"'; Memo1.Lines.Add('【変換前文字】'); Memo1.Lines.Add(s); //十分なサイズを取得 SetLength(buf,Length(s)+1); //全角変換 LCMapStringEx( LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_FULLWIDTH, PChar(s),Length(s), PChar(@buf[0]),Length(buf), nil,nil,0 ); d:=PChar(buf); Memo1.Lines.Add('【全角変換】'); Memo1.Lines.Add(d); //全角ひらがな大文字変換 LCMapStringEx( LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_FULLWIDTH or LCMAP_HIRAGANA or LCMAP_UPPERCASE, PChar(s),Length(s), PChar(@buf[0]),Length(buf), nil,nil,0 ); d:=PChar(buf); Memo1.Lines.Add('【全角ひらがな大文字変換】'); Memo1.Lines.Add(d); //全角カタカナ小文字変換 LCMapStringEx( LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_FULLWIDTH or LCMAP_KATAKANA or LCMAP_LOWERCASE, PChar(s),Length(s), PChar(@buf[0]),Length(buf), nil,nil,0 ); d:=PChar(buf); Memo1.Lines.Add('【全角カタカナ小文字変換】'); Memo1.Lines.Add(d); //半角変換 LCMapStringEx( LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_HALFWIDTH, PChar(s),Length(s), PChar(@buf[0]),Length(buf), nil,nil,0 ); d:=PChar(buf); Memo1.Lines.Add('【半角変換】'); Memo1.Lines.Add(d); //半角カナ小文字変換 LCMapStringEx( LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_HALFWIDTH or LCMAP_KATAKANA or LCMAP_LOWERCASE, PChar(s),Length(s), PChar(@buf[0]),Length(buf), nil,nil,0 ); d:=PChar(buf); Memo1.Lines.Add('【半角カナ小文字変換】'); Memo1.Lines.Add(d); Memo1.Lines.Add(''); end; end.
実行する
[実行]⇒[実行]をクリック、または「実行」ボタンを押して実行します。
(コンパイルされて実行されます。)
「Button1」をクリックすると変換前文字列と各種変換後の文字列が表示されます。

応用(半角カナだけを全角カナに変換)
半角カナだけを全角カナにするには文字列から連続する半角カナ部分だけを取り出して全角に変換すればできます。
半角カナは「。」(UTF16LEでの65377)から「゚」(UTF16LEでの65439)までの文字です。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} //半角カナだけを全角に変換する function HanKanaToZen(st:string):string; function ToZen(hst:string):string; var buf:array of char; begin //十分なサイズを取得 SetLength(buf,Length(hst)+1); LCMapStringEx( LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_FULLWIDTH, PChar(hst),Length(hst), PChar(@buf[0]),Length(buf), nil,nil,0 ); result:=PChar(buf); end; var i:Integer; s:char; HanKana:string; begin HanKana:=''; result:=''; for i := 1 to Length(st) do begin s:=st[i];//1文字だけ取り出す //半角カナ[。(65377)から゚(65439)]が連続している箇所を取り出す if (ord(s)>=Ord(Char('。'))) and (Ord(s)<=Ord(Char('゚'))) then begin HanKana:=HanKana+s; end else begin if HanKana<>'' then begin result:=result+ToZen(HanKana);//半角カナだけ全角変換 HanKana:=''; end; result:=result+s; end; end; if HanKana<>'' then result:=result+ToZen(HanKana);//半角カナだけ全角変換 end; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text:=HanKanaToZen('アイウabcdバビあいうバABCプペポプペポABCパピプ。'); end; end.