トップへ(mam-mam.net/)

文字列を半角全角カタカナひらがな大文字小文字変換 ~Delphiソースコード集

検索:

文字列を半角全角カタカナひらがな大文字小文字変換 ~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.