お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」

[Q]
JISとシフトJIS、EUC、JIS区点、全角、半角の変換をしたいのですが 関数が見つかりません。 半角カナだけを全角にしたいのですが?

[A]
もっと効率のいいものもあるかもしれませんが、以下の関数を作成して、使用する
プログラムに Uses してみてください。
[例]

{ start of Unit=============================================================}
{ Modified on June 19,1998 }
{===== henkanJ.pas =====}
unit HenkanJ;
interface
function JisToSJis(N:word):word;        {JISをシフトJISに}
function JisToKuten(N:word):word;       {JISを区点に}
function JisToEUC(N:word):word;         {JISをEUCに}
function SJisToJis(N:word):word;        {シフトJISをJISに}
function SJisToKuten(N:word):word;      {シフトJISを区点に}
function SJisToEUC(N:word):word;        {シフトJISをEUCに}
function KutenToJis(N:word):word;       {区点をJISに}
function KutenToSJis(N:word):word;      {区点をシフトJISに}
function KutenToEUC(N:word):word;       {区点をEUCに}
function EUCToJis(N:word):word;         {EUCをJISに}
function EUCToSJis(N:word):word;        {EUCをシフトJISに}
function EUCToKuten(N:word):word;       {EUCを区点に}
function WordToChar(N:word):string;     {数値を文字に}
function CharToWord(S:string):word;     {文字を数値に}
function HankToZen(S:string):string;    {半角を全角に}
function ZenToHank(S:string):string;    {全角を半角に}
function AlpToJis(c:char):word;         {アルファベットをJISに}
function AlpToSJis(c:char):word;        {アルファベットをシフトJISに}
function KigouToJis(c:char):word;       {記号をJISに}
function KigouToSJis(c:char):word;      {記号をシフトJISに}
function KanaToZen(S:string):string;    {カナ記号(#$A0〜#DF)のみを全角に}
function IsDBCSLeadChar(c:char):Boolean;{IsDBCSLeadByteの文字(char)版非API}

implementation
CONST KANA:ARRAY[#0$A6..#0$DF]OFBYTE=
     ($72,$21,
      $23,$25,$27,$29,$63,$65,$67,$43,
      $00,$22,$24,$26,$28,$2A,$AB,$AD,
      $AF,$B1,$B3,$B5,$B7,$B9,$BB,$BD,
      $BF,$C1,$C4,$C6,$C8,$4A,$4B,$4C,
      $4D,$4E,$CF,$D2,$D5,$D8,$DB,$5E,
      $5F,$60,$61,$62,$64,$66,$68,$69,
      $6A,$6B,$6C,$6D,$6F,$73,$00,$00);
      KIGOU:string=' !"#$%&''()=`|-^\~{@[+*};:]<>?_、。・,./ー「」';
      KKIGOU:string
                   =' !”#$%&’()=‘|−^¥ ̄{@[+*}'+
                    ';:]<>?_、。・,./ー「」';
      ZEN:ARRAY[$21..$76] of byte=
     (1,11,2,12,3,13,4,14,5,15,                       {あ}
      16,16+56,17,17+56,18,18+56,19,19+56,20,20+56,   {か}
      21,21+56,22,22+56,23,23+56,24,24+56,25,25+56,   {さ}
      26,26+56,27,27+56,9,28,28+56,29,29+56,30,30+56, {た}
      31,32,33,34,35,                                 {な}
      36,36+56,36+112,37,37+56,37+112,38,38+56,38+112,{は}
      39,39+56,39+112,40,40+56,40+112,
      41,42,43,44,45,6,46,7,47,8,48,49,50,51,52,53,   {まやら}
      54,54,12,14,15,55,13+56,16,19);                 {わ}


function JisToSJis(N:WORD):WORD; assembler;
asm
    add  ax,0a17eh ; shr  ah,1      ; jb  @1
    cmp  al,0deh   ; sbb  al,5eh
@1: xor  ah,0e0h
end;

function SJisToJis(N:WORD):WORD; assembler;
asm
    shl  ah,1      ; sub  al,1fh    ; js   @1
    cmp  al,61h    ; adc  al,0deh
@1: add  ax,1fa1h  ; and  ax,7f7fh
end;

function JisToKuten(N:WORD):WORD; assembler;
asm
    sub ax,2020h
end;

function KutenToJis(N:WORD):WORD; assembler;
asm
    add ax,2020h
end;

function EUCToJis(N:word):word; assembler;
asm
    and ax,7f7fh
end;

function JisToEUC(N:word):word; assembler;
asm
    or ax,8080h
end;

function EUCToKuten(N:word):word; assembler;
asm
   and ax,7f7fh
   sub ax,2020h
end;

function KutenToEUC(N:word):word;
asm
   add ax,2020h
   or  ax,8080h
end;

function SJisToEUC(N:word):word;
begin Result:=SJisToJis(N) or $8080 end;

function EUCToSJis(N:word):word;
begin Result:=JisToSJis( n and $7f7f) end;

function SJisToKuten(N:WORD):WORD;
begin Result:=JisToKuten(SJisToJis(N)) end;

function KutenToSJis(N:WORD):WORD;
begin RESULT:=JisToSJis(KutenToJis(N)) end;

function WordToChar(N:WORD):String;
begin Result:=char(Hi(N))+char(Lo(N)) end;

function CharToWord(s:string):word;
begin Result:=(ord(s[1]) shl 8) + ord(s[2]) end;

function HankToZen(s:string):string;
var w:word;
begin
  Result:='';
  while Length(s)>0 do begin
    if IsDBCSLeadChar(s[1]) then begin
      Result:=Result+Copy(s,1,2); Delete(s,1,2)
    end else if s[1] in [#0$a6..#0$af,#0$b1..#0$df]thenbegin
    if kana[s[1]]=0 then begin
         Result:=Result+s[1]; Delete(s,1,1)
      end else begin
         w:=$2500+(kana[s[1]] and $7f);
         if (kana[s[1]] and $80)=0 then begin
           Result:=Result+WordToChar(JisToSJis(w));
           if (Length(s)>1) and (s[2]in [#0$de,#0$df])thenbegin
             Result:=Result+WordToChar(JisToSJis($204d+Ord(s[2])));
             Delete(s,2,1)
           end;
           Delete(s,1,1)
         end else begin
           if (Length(s)>1) and (s[2] in [#0$de,#0$df])thenbegin
             w:=w+1+(Ord(s[2]) and 1);
             Delete(s,2,1)
           end;
           Result:=Result+WordToChar(JisToSJis(w));
           Delete(s,1,1)
         end
      end
    end else begin
      if s[1] in ['0'..'9','A'..'Z','a'..'z'] then begin
        Result:=Result+WordToChar(JisToSJis($2300+Ord(s[1])));
        Delete(s,1,1)
      end else
        if Pos(s[1],kigou)>0 then begin
          Result:=Result+WordToChar(KigouToSJis(s[1]));
          delete(s,1,1)
        end else begin
          Result:=Result+s[1]; Delete(s,1,1)
        end
    end
  end
end;
function ZenToHank(s:string):string;
var w:word;
begin
   Result:='';
   while Length(s)>0 do begin
     if s[1] in [#0$81..#0$9f,#0$e0..#0$fc]thenbegin
     w:=CharToWord(s+'@');
       if Hi(SJisToJis(w)) in [$24,$25] then begin
         if Lo(SJisToJis(w)) in [$21..$76] then begin
           w:=zen[Lo(SJisToJis(w))];
           Result:=Result+char((w mod 56)+$a6);
           case w div 56 of
           1:Result:=Result+'゛';
           2:Result:=Result+'゜';
           end;
           Delete(s,1,2)
         end else begin
           Result:=Result+s[1];
           Delete(s,1,1)
         end
       end else if Pos(Copy(s,1,2),kkigou)>0 then begin
         Result:=Result+kigou[Pos(copy(s,1,2),kkigou)div 2+1];
         Delete(s,1,2)
       end else if Hi(SJisToJis(w))=$23 then begin
         Result:=Result+char(lo(SJisToJis(w)));
         Delete(s,1,2)
       end else begin
         Result:=Result+Copy(s,1,2);
         Delete(s,1,2)
       end;
     end else begin
       Result:=Result+s[1];
       Delete(s,1,1)
     end;
   end;
end;
function AlpToJis(c:char):word;
begin
  if c in ['0'..'9','A'..'Z','a'..'z'] then Result:=$2300+ord(c)
  else Result:=Ord(c){ ここに、他の変換を置く }
end;
function AlptoSjis(c:char):word;
begin result:=JisToSJis(AlpToJis(c)) end;
function KigouToJis(c:char):word;
begin result:=SJisToJis(KigouToSJis(c)) end;
function KigouToSJis(c:char):word;
var v:integer;
begin
  v:=Pos(c,kigou);
  if v>0 then Result:=Ord(kkigou[v*2-1]) shl 8 + Ord(kkigou[v*2])
         else Result:=Ord(c)
end;
function KanaToZen(S:string):string;
begin
  Result:='';
  while Length(s)>0 do begin
    if IsDBCSLeadChar(s[1]) then begin
      Result:=Result+Copy(s,1,2);
      Delete(s,1,2)
    end else begin
      if s[1] in [#0$A0..#0$DF]thenbegin
        if Copy(s+' ',2,1)[1] in ['゛','゜'] then begin
          Result:=Result+HankToZen(Copy(s,1,2));
          Delete(s,1,2)
        end else begin
          Result:=Result+HankToZen(s[1]);
          Delete(s,1,1)
        end
      end else begin
        Result:=Result+s[1];
        Delete(s,1,1)
      end
    end
  end
end;
function IsDBCSLeadChar(c:char):boolean;
begin
  Result:=c in [#0$81..#0$9f,#0$E0..#0$fc]
end;
end.
{ end of Unit===============================================================}


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。

Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会