RichEditに絵文字を表示させるには


Hiisan  2020-12-18 08:57:23  No: 149499

[環境]Delphi10.3.2、Window10で、RechEditに例えば[U+1F600]を、絵文字を表示させるには、
XRAY様の[絵文字の描画]を、参考にして検討しているのですが、わかりません。
[1]usesに[MECSUtils]をセットすると、エラー表示がでる。:CodePointToUTF16
勉強不足ですが、宜しくお願いいたします。


Mr.XRAY  2020-12-19 15:55:41  No: 149504

procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.Font.Name := 'Segoe UI Emoji';
  RichEdit1.Font.Size := 50;

  RichEdit1.Lines.Text := #$1F600 + ' えもじ絵文字 ';
end;


Hiisan  2020-12-19 21:01:55  No: 149505

XRayさま、RichEdit1.Lines.Text := #$1F600 ;で表示できましたが、
$1F600が、Strringの場合の変換法を、お忙しい所恐れ入りますが、お教え願います。
当然Char(strtoint('$1F600')で(Ansi,WideCharでも不可)変換すると、だめでした。(#の処理)


Mr.XRAY  2020-12-19 21:50:42  No: 149506

> $1F600が、Strringの場合の変換法を、お忙しい所恐れ入りますが、お教え願います。
> 当然Char(strtoint('$1F600')で(Ansi,WideCharでも不可)変換すると、だめでした
。(#の処理)

最初の質問の文章同様,意味不明,理解不可.


Mr.XRAY  2020-12-20 19:34:24  No: 149507

このスレッドのタイトルを読んで絵文字って何 ? と思った方がいると思います.
質問者が書いている,参考にした記事というのは以下だと思います.
話の元を示さないでゴチャゴチャ書いても,意味不明です.
質問者がわかりませんと書いていますが,読んでいる人の方が何が何だか分かりません.
単なる一人相撲です.

[ Emoji ( 絵文字 ) の描画 ]
http://mrxray.on.coocan.jp/Delphi/Others/Emoji.htm

既に絵文字を表示するコードを掲載しましたが,
このようなことを理解するには文字符号について知っておく必要があります.

ShowMessaage(#$6771#$4EAC);

とすると「東京」と言う文字列を表示します.
この時,$6771, $4EAC を文字符号化点,コードポイント,文字コードと言います.
$ はその後に続く文字が 16 進数であることを意味します.
# を付けるとコードポイントの意味となり,文字として扱われます.
このように,文字には数値が割り当てられています.

質問者が書いている U+1F600 は使えません.コートポイントは全て半角の文字です.
U+ というのは UTF-16 と呼ばれているユニコードの文字符号化方式のコードポイントを意味します.
つまり,実際のコードポイントは $1F600 (全て半角) です.
この先頭に # をつけて String 型の変数に代入します
これが最低限必要な知識です.

記事中にはサロゲートペア等の用語が出てきますが,ネットで調べてください.
私のサイトにもサンプル等があります.
ただし,ほとんど DEKO さんという方が書いている内容の受け売りです.
ユニコードは,ユニコードコンソーシアムが策定し,
ISO(国際標準化機構) / IEC(国際電気標準会議)で規格化されています.

これらのコードポイントは Delphi 2009 以降で使用可能です.
ユニコードの全ての文字が Windows のフォントで使用可能なわけではありません.


Hiisan  2020-12-23 23:01:49  No: 149508

Mr.XRAYさま、勉強不足で、申し訳ありませんでした。
またご親切なご指導ありがとう御
座いました。No: 149499に記載の通り、
 XRAYさまのURLは、参照しての質問でしたが、
 No: 149505の質問は、例えばEdit1.textがUniCode「$1F600」である場合(String)の花文字の取得法を、質問したつもりですが
 宜しくお願いいたします。:意味不明でしょうか


Mr.XRAY  2020-12-24 09:39:17  No: 149509

ついでですので,更に追加です.

> このように,文字には数値が割り当てられています.

Delphi 2009 以降は UTF-16 と呼ばれる文字符号化方式ですが,
その符号化の内,BMP (Basic Multilingual Plane) と呼ばれる領域があります.

これはコードポイントが 2 バイトで,世界中のほとんどの文字・記号類が含まれています.
しかし,これでは不足するため,2 バイトを超える文字符号が定義されています.
2 バイトを超える文字符号にもいろいろ種類がありますが,絵文字もそうです.

今回の $1F600 は「絵文字」の記事に書いている通りサロゲートペアと言って,
実際には 2 バイトの符号のペアで構成されています.
このことは,以下のコードで確認できます.どちらも同じ文字を表示します.
このようなのを複数エレメント構成の文字といいます.
ただし,実際に使用する時は $1F600 を使用することができます.

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Font.Name := 'Segoe UI Emoji';
  Edit1.Font.Size := 20;

  Edit1.Text := #$1F600;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit1.Font.Name := 'Segoe UI Emoji';
  Edit1.Font.Size := 20;

  Edit1.Text := #$D83D#$DE00;
end;

よく使用されている Char 関数は 2 バイト用です.SizeOf(Char) は 2 を返します.
そのため,「絵文字」のサンプルでは MECSUtils の関数を使用しています.
「絵文字」の記事のサンプルでは Char 関数を使用していません. 
MECSUtils は「絵文字」の記事にリンクを貼っています.そこから入手できます.
サロゲートペアについても「絵文字」の記事にリンクを貼っています.
記事だけでなくリンクも参考にしてください.記事中のリンクは伊達ではありません.

バイトの意味については以下を参考にしてください.
今回の $1F600 は 2 バイトのペアですから,4 バイトです.
2 バイトは 16 ビットです.4 バイトは 32 ビットです.
「絵文字」の記事に 32 ビット云々のリンクを貼っています.

[ テキストをバイナリに変換して保存 ]
http://mrxray.on.coocan.jp/Delphi/Others/TextToBinary.htm

U+1F600
https://unicode.org/emoji/charts/full-emoji-list.html#1f600
  
   
※ 私はエスパー (超能力者) ではありません.
※ プログラムというのは,コードを書いてそれを実行します.
※ どんなコードを実行して,どんな結果になったのか,
※ ダメとかエラーが発生しましただけで状況が理解できる能力は,私にはありません.


take  2020-12-24 09:48:54  No: 149510

質問は絵文字の表示方法じゃなかったでしたっけ?取得方法が質問?

その花文字を入力出来るなら、その花文字をEditに入力しておいて
プログラム上から変数に入れてその変数を評価して16進ダンプ表示にすれば内部構造がわかるかと思います。

FFFFHまでのユニコードはそのままいけるとして10000H以降の文字コードを試しに解析表示してみました。

MS明朝に10300H 古代イタリア文字で Aがフニャフニャになった文字があるのでそれを手入力
それを変数に入れて評価 
ユニコードでU+表記と呼べば良いのか D800 DF00の 2ワード
UTF-8だと F0 90 8C 80の4バイト

 Memo1.Lines.Text := #$D800#$DF00 + ' えもじ絵文字 ';

これで古代イタリア文字で Aがフニャフニャになった文字が表示される。

取得方法というかその文字列をCopyで分解したときに 言われている絵文字だと 2ワード、
そうでない文字は1ワードになるのをうまく処理したいというならまた別の話になりますが


Mr.XRAY  2020-12-24 12:39:46  No: 149512

「絵文字」の記事に掲載しいる以下のコードの説明です.

http://mrxray.on.coocan.jp/Delphi/Others/Emoji.htm#list2

コードポイントの値を文字として表示するには,以下のコードで可能です.

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := #$1F6BA;
end;

しかし,これでは設計時にコードポイントを変更してストする必要があります.
そこで,以下のように,コードポイントの値を string 型の変数に代入します.
この変数を別の TEdit にセットしておけば,EXE 実行時に変更できて便利です.

procedure TForm1.Button2Click(Sender: TObject);
var
  LText : string;
begin
  // この値を別の TEdit にセットしてけば,実行時に変更でき,テストに便利
  Ltext := '$1F6BA';
  Edit1.Text := CodePointToUTF16(StrToInt(LText));
end;

「絵文字」に掲載しているサンプルはこの方針で作成しています.
1 文字だけでなく,複数の文字を処理できるようにしています.
そのため,TStringList というクラスを使用しています.
TStringList は複数の文字列を格納できます.
格納した文字列を分離して $XXXX として取り出すために,# という文字を使用しています. 
(実際には別の文字でも構わない)
取り出した $XXXX は文字列ですから,それを数値にしてから,また文字にします.
この数値は 32 ビット (4 バイト) です.Char 関数では文字にできません.
Char 関数で文字にできるのは 16 ビット (2 バイト) の整数値です.

文字は,フォントによっては正常に表示できないことがあるので,
フォント名のリストを作成して TComboBox で選択できるようにしています.


Hiisan  2020-12-24 18:44:46  No: 149515

XRAYさま、サンプルまで記載していただき、有難う御座います。サンプルに記載の
Edit1.Text := CodePointToUTF16(StrToInt(LText));を動作させる場合(質問場番号No: 149499にも記載)
Usesに[MECSUtils]が、必要だと思うのですが、[MECSUtils]は、Delphi10.3.2に同梱されているのでしょうか。
(EmbaraCardero/Studio/20.0を探しましたが、存在しませんでしたので、、DownLoadしインストールする必要があると、思いますが)
[1]同梱されていない場合:https://ht-deko.com/tech021.htmlを、参照して、指定先からDownload後のインストール方法
最初に、戻る事になりますが、宜しくお願い致します。説明不足?


HFUKUSHI  2020-12-24 18:58:56  No: 149516

そのページにあるCC(CodeCentral)のリンクからダウンロードしたものを展開し、プロジェクトと同じ場所に置き、プロジェクトに追加すればOKのはずです


Mr.XRAY  2020-12-24 19:14:36  No: 149518

なのですが,
入手しなくてもテスト可能なよう EXE をダウンロードできるようにしました.


Hiidan  2020-12-24 21:16:52  No: 149519

色々探しましたが、Downloadの方法(OpenIDの入力)が、分かりません。(個人で)
宜しくお願い致します。


Mr.XRAY  2020-12-24 22:42:52  No: 149520

> 色々探しましたが、Downloadの方法(OpenIDの入力)が、分かりません。(個人で) 

探した ?? 探す必要はないと思いますか・・・
OpenID ??

[ DownLoad ] をクリックしたら,[ Developer Network and Registered User Login ]
というタイトルのページになるのではないのですか ? 


Hiisan  2020-12-25 00:14:22  No: 149521

Mr.XRAY様、その通りでした。EmbaraCarderoに登録した、メール番号とPWでいけました。
どうもありがとうございました。メール番号かPWが、違うとOpenIDが、表示され--->OpenIDを検索しました。
通常であれば、メール番号かPWが違いますとメッセージが、でるので、勘違いしました。


Mr.XRAY  2020-12-28 22:12:59  No: 149523

[ コミュニティの場は give & take ( ギブ・アンド・テイク ) ]
http://mrxray.on.coocan.jp/Delphi/Others/013.htm#04


Hiisan  2020-12-30 22:09:29  No: 149525

XRay様のご指摘の通りです。
(解決したら,どのような操作,手順で解決したのか,どのようなコードを使用したのか書けば,同じような問題,トラブルかが起きた方の参考になり,上記のようなことはなくなるかも知れません) 
質問の「RichEditに絵文字を表示させるには」で、カラー表示の所で、今つまずいていますので、もう少し検討後にコメントさせてください。


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








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