DelphiでLCMapStringExを使った文字列変換|半角・全角・ひらがな・カタカナ・大小文字対応
このページでは、Windows API「LCMapStringEx」をDelphiで利用して、文字列を以下の形式に変換する方法を解説しています:
- 半角 ⇔ 全角
- ひらがな ⇔ カタカナ
- 大文字 ⇔ 小文字
LCMapStringExは、文字列のロケール変換に特化したAPIで、LCMapStringよりも柔軟かつ推奨される手法です。Delphiでの実装例を交えながら、各変換フラグの使い方や注意点を紹介します。
また、半角カナのみを全角カナに変換する処理など、実用的な応用例も掲載しています。
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.
