Unicodeで入力した文字を、StringGridに入れるには?

解決


かんとく  2010-05-29 01:08:06  No: 38580

お世話になっております。

Delphi2007,XPです。

StringGridを置き、

StringGrid1.Cells[1,1]:='櫐櫑櫒櫓櫔櫕';
を実行すると、
Cells[1,1]の値が、
?櫑?櫓??
になってしまいます。

Unicodeで、
櫐=6AD0
櫑=6AD1
櫒 =6AD2
櫓=6AD3
櫔=6AD4
櫕=6AD5
です。

※ 櫒 =6AD2は、NotePadでは表示されません。

StringGridに、
櫐櫑櫒櫓櫔櫕が正しく入るようにする方法はあるでしょうか?

よろしくお願いします。


かんとく  2010-05-29 01:34:09  No: 38581

すでに、この掲示板でも文字化けしてしまっていますね。
'櫐櫑櫒櫓櫔櫕';
は、
Unicodeが、6AD0〜6AD5の6つの文字です。

もうなんとなくダメな気がしますが、よろしくお願いします。


D  2010-05-29 09:24:52  No: 38582

Delphi6 Pro XPで。

Unicodeな文字列をUTF-7に変換してStringGridに入れ、StringGridのOnDrawCellイベントででUTF-7に変換した文字列をUnicode文字列に戻して表示させるという方法があります。

function gfnsWideToUtf7(sSrc: WideString): AnsiString;
//WideStringをUTF-7にエンコードして返す
var
  li_Len:  Integer;
  lp_Buff: PAnsiChar;
begin
  li_Len  := WideCharToMultiByte(CP_UTF7, 0, PWideChar(sSrc), -1, nil, 0, nil, nil);
  lp_Buff := AllocMem(li_Len + 1);
  try
    WideCharToMultiByte(CP_UTF7, 0, PWideChar(sSrc), -1, lp_Buff, li_Len, nil, nil);
    Result := AnsiString(lp_Buff);
  finally
    FreeMem(lp_Buff);
  end;
end;

function gfnsUtf7ToWide(sSrc: AnsiString): WideString;
//UTF-7でエンコードされている文字列をWideStringにして返す
var
  li_Len:  Integer;
  lp_Buff: PWideChar;
begin
  li_Len  := MultiByteToWideChar(CP_UTF7, 0, PAnsiChar(sSrc), -1, nil, 0);
  lp_Buff := AllocMem((li_Len + 1) * 2);
  try
    MultiByteToWideChar(CP_UTF7, 0, PAnsiChar(sSrc), -1, lp_Buff, li_Len);
    Result := WideString(lp_Buff);
  finally
    FreeMem(lp_Buff);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ls_Wide: WideString;
begin
  ls_Wide :=
      WideString(WideChar($6AD0))
    + WideString(WideChar($6AD1))
    + WideString(WideChar($6AD2))
    + WideString(WideChar($6AD3))
    + WideString(WideChar($6AD4))
    + WideString(WideChar($6AD5))
  ;
  StringGrid1.Cells[0, 0] := gfnsWideToUtf7(ls_Wide);
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with StringGrid1.Canvas do begin
    FillRect(Rect);
    DrawTextW(Handle, PWideChar(gfnsUtf7ToWide(StringGrid1.Cells[ACol, ARow])), -1, Rect, DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE);
  end;
end;

>※ 櫒 =6AD2は、NotePadでは表示されません。
  フォントを変えれば表示されると思います。
私の環境では「MS Pゴシック」だと表示されませんが、「MS ゴシック」や「MS P明朝」なんかだと表示されます。


初心者  2010-06-03 01:46:57  No: 38583

それなら別で保持しておいてOnDrawCellでそっちを参照すればいいだけじゃないの?
なんでUTF-7なんかに変換してわざわざ代入する必要があるのか。


D  2010-06-03 20:59:50  No: 38584

>なんでUTF-7なんかに変換してわざわざ代入する必要があるのか。

  データを別に保持する必要がないから。
別に保持する場合ストリンググリッドとの同期が必要になるのでその管理が面倒かなと。
データを増減すればグリッドの行や列も増減させなければならないし、グリッドの列や行を移動させればデータの移動や参照先の変更などが必要になるしで、と。

UTF-7に変換してストリンググリッドに持てばそれらの手間は必要ないので手軽かなと。

別に持つデータとグリッドの同期の手間が負担でなければわざわざ変換して代入するわずらわしさもないし速度的にも優位なのでそっちの方が良いと思います。

まぁ、色々ある解決策のうちの一つということで。


かんとく  2010-06-04 04:16:32  No: 38585

ありがとうございます。

StringGrid1のOptionsプロパティのGoEditingをTrueにして、Cell[0,0]をクリックすると、コードを変換された文字が表示されていて、本当はこの編集部分でも指定した漢字が出ればいいなと思いましたが、表示だけでもできるようになったので、これでいいと思います。

ありがとうございました。


D  2010-06-04 09:45:40  No: 38586

>本当はこの編集部分でも指定した漢字が出ればいいなと思いましたが

  それをするにはUnicode対応のEditコントロールをCreateWindowW APIを使って作成する必要があります。

http://cult-drang.com/program/tips/unicode/edit_memo.html
http://cult-drang.com/program/tips/unicode/richedit.html
http://cult-drang.com/program/tips/unicode/richedit/richedit_1.html

手前味噌で恐縮ですがこのあたりが参考になるかと思います。


かんとく  2010-06-05 03:00:15  No: 38587

Dさん

ありがとうございます。

教えてもらった分は、難しそうなので、表示の部分だけできた最初の分だけでいいです。

ありがとうございました。


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

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






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