UniCodeを使うには?

解決


龍猫  2009-03-10 19:34:04  No: 33610

初歩的な質問ですみません。
別スレッドの質問(指定のフォントを表示するには?)から
流れてきました。

UniCodeというのがわからないので教えてください。

Edit1.Text は WideString ですか?
以下のようなコードで Canvas に表示できるとすると

var
  WP : PWChar;
  WS : WideString;
begin
  WS := WideChar($BBF8) + WideChar($C548);
  WP := PWideChar (WS);
  TextOutW(Canvas.Hangle, 0, 0, WP, Length(WP));
end;

Edit1.Text は WideString ですから
  WP := PWideChar (Edit1.Text);
でいけると思ったのですが
UniCode というのが影響するみたいで
文字化けを起こします。

Edit1.Text を UniCode というものの WideString に
するにはどうすればよいのでしょうか?


読んだ?  2009-03-10 20:57:45  No: 33611

> Uni 2009/03/05(木) 20:39:39 
> (略)
> Delphi2009ならUNICODE対応なので、そのままMemoやRichEditで表示できると思います。
> でもDelphi2007をお使いの様ですのでその場合は簡単にはUNICODEで利用できません。
> 以前はTNTWareの[TNT Unicode Controls]というのがFreeであったのですが現在は有料となっています。(http://www.tmssoftware.com/site/tmsuni.asp)
> ここで(http://mh-nexus.de/en/tntunicodecontrols.php)別バージョンが入手可能なようですが目的にあってるかは分かりません

引用元: https://www.petitmonte.com/bbs/answers?question_id=6143


TNTWareフリー最終バージョン  2009-03-10 22:58:00  No: 33612

ここにあるよ。
http://www.axolot.com/TNT/


TOBY  2009-03-12 00:22:33  No: 33613

質問主の求めているのと違うような…

WP := PWideChar(WideString(Edit1.Text));

これか、stringからWideStringに暗黙で変換できるので

var WS: WideString; しておいて、

WS := Edit1.Text;
WP := PWideChar(WS);

って感じでいけないかな?

Edit1.Textの時点で文字化けしているものはいけない可能性が高いかと。


龍猫  2009-04-01 18:41:13  No: 33614

返事が送れてすみません。

>WS := Edit1.Text;
>WP := PWideChar(WS);
この状態では使用ができないみたいです。

以下、私がわからないのは
Widechar と String の違いなのですが
char は  \0 で終わりを認識して、String は [0] に
文字長が入っているということでいいのですよね
各バイト単位で見ると同じ内容の値があるんじゃないんですか?
つまり、Edit1.Text は  WideString なので
WideCharと同じ用にUniCodeが使えると思ったのですが。
また、IMEから入力したときも最初は Edit1.Text に UniCode の
文字が表示されるのに、Text を参照すると文字化け[?]になります。

Edit1.Text は WideString になっているけれども
実際内部では別の型でほぞんされているということなのでしょうか?
それとも、WideString と WideChar の違いによるものなのでしょうか?
そのあたりが良くわからないのです。

すみません。


monaa  2009-04-01 19:06:15  No: 33615

一般的な型、String等はきまったサイズではありません。
String型はDelphi2009とそれ以下でサイズが倍違います。
それに対して、byte,bool等は見た目上は一定で統一されています。
Edit1.TextがWideStringというのはDelphi2009でのみ保障されており、
その他のバージョンではAnsiStringです。
テキスト文字列の扱いがAnsiStringですし、Editを作成するCreateWindowExも
内部でCreateWindowExAが呼ばれています。
データをひとたび転送すれば、D2009以前であればAnsiStringで送られます。
その際、途中にWideStringがあったとしても、Delphiは内在的にAnsiString型変換を行います。

>>char は  \0 で終わりを認識して、String は [0] に
>>文字長が入っているということでいいのですよね
charは2(4)バイト確保=byte(Word)、StringはCharの配列型です。
最後に0を入れるのは、プログラマ任せで保障されていません。
ですがDelphiでStringを扱えば自動的に最後に0が入ります。
Stringの[0]は確か0だったと思います。(未確認)


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

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






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