ホーム >プログラム >Delphi 6 ローテクTips

JISの読み書き

JISを読み込んだり書き込んだり。

参考サイト


WideCharToMultByte APIとMultiByteToWideChar APIはその第一引数のコードページを変えることで様々な文字コードとWideStringとの相互変換ができます。

const
  CP_JIS = 50220; //半角カナは全角に変換される。
  // CP_JIS = 50221; //半角カナOK。
  // CP_JIS = 50222; //漢字SI/SO

JISのコードページは3種類あるようで、とりあえず私は半角カタカナ不可の50220にしています。
まぁこの辺は好き好き、、というか必要に応じて選択してみて下さいということで。

function gfnsJisToWide(sSrc : AnsiString) : WideString;
var
  li_Len  : Integer;
  lp_Buff : PWideChar;
begin
  li_Len  := MultiByteToWideChar(CP_JIS, 0, PAnsiChar(sSrc), -1, nil, 0);
  lp_Buff := AllocMem((li_Len + 1) * 2);
  try
    MultiByteToWideChar(CP_JIS, 0, PAnsiChar(sSrc), -1, lp_Buff, li_Len);
    Result := WideString(lp_Buff);
  finally
    FreeMem(lp_Buff);
  end;
end;

function gfnsWideToJis(sSrc : WideString) : AnsiString;
var
  li_Src  : Integer;
  li_Len  : Integer;
  lp_Buff : PAnsiChar;
begin
  //http://www.gesource.jp/weblog/?p=738
  //http://ht-deko.minim.ne.jp/ft0909.html#090927
  li_Src  := Length(sSrc);
  li_Len  := (li_Src * 5) + 4 - (li_Src div 2);
  lp_Buff := AllocMem(li_Len +1);
  try
    WideCharToMultiByte(CP_JIS, 0, PWideChar(sSrc), -1, lp_Buff, li_Len +1, nil, nil);
    Result := AnsiString(lp_Buff);
  finally
    FreeMem(lp_Buff);
  end;
end;

参考サイトにあるようにWindows 2000でWideCharToMultiByte APIを使ってWideStringをJISへセオリー通りに変換すると文字数が足りなくなるそうです。
ということで本来ならOSのバージョンを調べて処理を振り分けるのが良いのでしょうが簡易に済ませています。


2011-05-12: