2005年08月06日

2バイト文字コードを変換する方法

ソリューションプロバイダが好き勝手にできる
やりたい放題のITプロジェクトとは別に、
皆さんや皆さんの周りのお客さんは、
H/Wの保守期限切れなどによる
代替えH/Wの導入とプラットフォームの変更、
システムのオープン化や、ダウンサイジング化といった
課題に直面していることの方が多いと思います。

今回はそういったマルチプラットフォーム間の
システムリンケージで必要な文字コード変換関数を
まとめて6パターン紹介しましょう。

文字コード変換関数は
2バイト文字コードを別の2バイト文字コードへ変換します。
1バイトと2バイト文字が混在する
際の変換に対応していませんので、
必要に応じ修正してから利用してください。

全ソースは【続きを読む】をクリック!

関数
説明
function _EUC2JIS(
 pString: String): String;
EUC文字コードをJIS文字コードへ変換します。
function _EUC2SJIS(
 pString: String): String;
EUC文字コードをシフトJIS文字コードへ変換します。
function _JIS2EUC(
 pString: String): String;
JIS文字コードをEUC文字コードへ変換します。
function _JIS2SJIS(
 pString: String): String;
JIS文字コードをシフトJIS文字コードへ変換します。
function _SJIS2EUC(
 pString: String): String;
シフトJIS文字コードをEUC文字コードへ変換します。
function _SJIS2JIS(
 pString: String): String;
シフトJIS文字コードをJIS文字コードへ変換します。

関連書籍


Copyright guy@かしらもんじ でぇ〜

注意:
 下記ソースファイルは、本ページの管理者である「guy」が個人的に作成しました。
 このソースは作者に断り無く、個人がコピー、改造することは許可しますが、
 いかなる場合であっても、商用目的に使用することを固く禁じます。
 あと、ホームページでの公開の都合上、各ソースの先頭に全角スペースが入ってます。
 あなたがDelphiでコンパイルする前に、この全角スペースを半角スペースに変換してくださいね。

Delphi Source File: Utils.pas
//------------------------------------------------------------------------------
function _EUC2JIS(pString: String): String;
var
 lCnt: Integer;
begin
 for lCnt := 1 to Length(pString) do
  Dec(pString[lCnt], $80);
 Result := pString;
end;

//------------------------------------------------------------------------------
function _EUC2SJIS(pString: String): String;
begin
 Result := _JIS2SJIS(_EUC2JIS(pString));
end;

//------------------------------------------------------------------------------
function _JIS2EUC(pString: String): String;
var
 lCnt: Integer;
begin
 for lCnt := 1 to Length(pString) do
  Inc(pString[lCnt], $80);
 Result := pString;
end;

//------------------------------------------------------------------------------
function _JIS2SJIS(pString: String): String;
var
 lCnt,
 lIdx,
 lCh1,
 lCh2: Integer;
begin
 for lCnt := 1 to (Length(pString) div 2) do
 begin
  lIdx := lCnt * 2 -1;
  lCh1 := Integer(pString[lIdx]);
  lCh2 := Integer(pString[lIdx+1]);
  if ((lCh1 mod 2) <> 0) then
  begin
    lCh1 := ((lCh1 + 1) div 2) + $70;
    Inc(lCh2, $1f);
  end
  else
  begin
   lCh1 := (lCh1 div 2) + $70;
   Inc(lCh2, $7d);
  end;
  if (lCh1 >= $a0) then Inc(lCh1, $40);
  if (lCh2 >= $7f) then Inc(lCh2);
  pString[lIdx] := Char(lCh1);
  pString[lIdx+1] := Char(lCh2);
 end;
 Result := pString;
end;

//------------------------------------------------------------------------------
function _SJIS2EUC(pString: String): String;
begin
 Result := _JIS2EUC(_SJIS2JIS(pString));
end;

//------------------------------------------------------------------------------
function _SJIS2JIS(pString: String): String;
var
 lCnt,
 lIdx,
 lCh1,
 lCh2: Integer;
begin
 for lCnt := 1 to (Length(pString) div 2) do
 begin
  lIdx := lCnt * 2 -1;
  lCh1 := Integer(pString[lIdx]);
  lCh2 := Integer(pString[lIdx+1]);
  if (lCh1 >= $e0) then Dec(lCh1, $40);
  if (lCh2 >= $80) then Dec(lCh2);
  if (lCh2 >= $9e) then
  begin
   lCh1 := (lCh1 - $70) * 2;
   Dec(lCh2, $7d);
  end
  else
  begin
   lCh1 := ((lCh1 - $70) * 2) - 1;
   Dec(lCh2, $1f);
  end;
  pString[lIdx] := Char(lCh1);
  pString[lIdx+1] := Char(lCh2);
 end;
 Result := pString;
end;

posted by guy at 07:38 | 文字列操作編
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。