拙作の返信屋2007では、シフトJIS、JIS、EUC-JPの文字コード変換を自前で実装している。ところが、最近知ったのだが、WindowsAPIを使えば、わざわざ自前で実装しなくてもこれらの変換はカンタンにできるようだ。
そのAPIはWideCharToMultiByte、MultiByteToWideCharだ。
WideCharToMultiByteは、ユニコード文字列をマルチバイト文字に変換し、MultiByteToWideCharはその逆の変換を行う。
つまり、シフトJISからJISへの変換を行うなら、MultiByteToWideCharでユニコードに変換し、変換したユニコードを、WideCharToMultiByteでJISコードに変換するという手順になる。以下のような感じ。
//シフトJISをJISに変換する。
function SJIStoJIS(const S: string): string;
var
DestLen: Integer;
W: WideString;
begin
//変換後の長さを得る。932はシフトJISのコードページ。
DestLen := MultiByteToWideChar(932, 0, PChar(S), -1, nil, 0);
if DestLen > 0 then
begin
SetLength(W, DestLen - 1); //メモリを確保
//ユニコードに変換。
MultiByteToWideChar(932, 0, PChar(S), -1, PWideChar(W), DestLen - 1);
//変換後の長さを得る。50220はJIS(ISO-2022-JP)のコードページ。
DestLen :=
WideCharToMultiByte(50220, 0, PWideChar(W), -1, nil, 0, nil, nil);
if DestLen > 0 then
begin
SetLength(Result, DestLen - 1); //メモリを確保
WideCharToMultiByte(50220, 0, PWideChar(W), -1,
PChar(Result), DestLen - 1, nil, nil);
end;
end;
end;
Windowsがサポートしているコードページなら、どの文字コードにも変換できるようだ。コードページはMSDNに記載がある。