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

EUCの読み書き

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

参考サイト


WideCharToMultByte APIとMultiByteToWideChar APIはその第一引数のコードページを変えることで様々な文字コードとWideStringとの相互変換ができます。
ということでEUCを読み込むにはTStringListのLoadFromFileでEUCのテキストファイルを読み込んでMultiByteToWideChar APIの第一引数にEUCのコードページを指定してWideStringに変換すればOKです。

const
  //CP_EUC = 51932; //MultiByteToWideCharとWideCharToMultiByteではエラーになる。
  CP_EUC = 20932; //変わりにこちらを使うとOK。

とはいえEUCのコードページのうち51932はMultiByteToWideCharとWideCharToMultiByte APIでは変換できませんでした。
変わりに20932を指定するとOKでした。
ちなみに20932ではウムラウトのようなUnicodeな文字にも対応しているようでWideStringとの相互変換でも代替文字に変わったり「?」に変わったりしません。
とはいえすべてOKというわけでもなく、サロゲートペアやハングルは「?」に変わってしまいます。

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

function gfnsWideToEuc(sSrc : WideString): AnsiString;
var
  li_Len  : Integer;
  lp_Buff : PAnsiChar;
begin
  li_Len  := WideCharToMultiByte(CP_EUC, WC_COMPOSITECHECK, PWideChar(sSrc), -1, nil, 0, nil, nil);
  lp_Buff := AllocMem(li_Len + 1);
  try
    WideCharToMultiByte(CP_EUC, WC_COMPOSITECHECK, PWideChar(sSrc), -1, lp_Buff, li_Len +1, nil, nil);
    Result := AnsiString(lp_Buff);
  finally
    FreeMem(lp_Buff);
  end;
end;

2011-05-12: