初歩的な質問ですみません。
別スレッドの質問(指定のフォントを表示するには?)から
流れてきました。
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 に
するにはどうすればよいのでしょうか?
> 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
ここにあるよ。
http://www.axolot.com/TNT/
質問主の求めているのと違うような…
WP := PWideChar(WideString(Edit1.Text));
これか、stringからWideStringに暗黙で変換できるので
var WS: WideString; しておいて、
WS := Edit1.Text;
WP := PWideChar(WS);
って感じでいけないかな?
Edit1.Textの時点で文字化けしているものはいけない可能性が高いかと。
返事が送れてすみません。
>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 の違いによるものなのでしょうか?
そのあたりが良くわからないのです。
すみません。
一般的な型、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だったと思います。(未確認)
ツイート | ![]() |