Delphi5での全角文字の処理について

解決


万年初心者  2013-10-04 03:22:33  No: 45366

type
  TZS2 = string[2];  //(#1)
  TZS2 = array[1..2] of Char; //(#2)

  RZMax = 110;
  RZenMap: array[1..RZMax] of TZS2 =
  ('  ', '。', '”', '゛', '゜', '´', '(', ')', '〔', '〕',  // 1
   '[', ']', '{', '}', '【', '】', '《', '》', '「', '」',  // 2
   ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
   '◎', '○', '●', '☆', '★', '⊿', '∮', '§', '£', '∑'); //11

function CheckZenMap(const S: TZS2): Boolean;
var
  i: Integer;
begin
  Result := False;
  i := 1;
  repeat
    if RZenMap[i] = S then Result := True;
    Inc(i);
  until (i > RZMax) or Result;
end;

  S[j]、S[j+1] には漢字の ShiftJis 第1,第2コードが入っている
   zs[1] := S[j];   zs[2] := S[j+1];
   if  CheckZenMap(zs) then

  (#1)のときzs[2]にゴミのコードが入るときがあります。
  (#1)と(#2)では何が違うのでしょうか?


monaa  2013-10-04 08:51:27  No: 45367

予約語stringはメモリを確保するだけで初期化はしてくれないみたいです。
半角英数は1byte文字なので、2byte目は何も定義されてません。
array[1..2] of Char; は場合によっては0で初期化してくれるので、
運良く動いているだけかと思います。


万年初心者  2013-10-04 22:18:22  No: 45368

回答ありがとうございます。今のところ
  array[1..2] of Char;
では不具合は起きていません。
  TZS2 = string[2];
ではアプリを立ち上げた直後不具合が起こるときと、起きないときがあります。
> 予約語stringはメモリを確保するだけで初期化はしてくれないみたいです。
  ということであれば string でも適当な文字を放り込んで初期化すればいいと思い、一応下のようにしたら、不具合は起きませんでした。もうしばらく様子を見たいと思います。

var
  j,L: Intger;
  S: string;
  zs: TZS2;
begin
   zs[1] := 'a';   zs[2] := 'b'; //適当な文字で初期化
   j := 1;    L := Length(S);
   repeat
     if S[j] in [#$81..#$9F, #$E0..#$FC] then
     begin
       zs[1] := S[j];   zs[2] := S[j+1];
       if CheckZenMap(zs) then
       ・・・・・・・・・・・・・・・・
      end;
    until j > L;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加