トップページ > 記事閲覧
IVS(漢字異体字シーケンス)への対応について
名前:Citrine 日時: 2019/11/22 22:20

お世話になっております。テキスト描画周りで機能追加の要望があるためスレッドを立てさせていただきました。 題名に書いた通りですが、DrawString系関数をIVS(漢字異体字シーケンス)に対応していただけないでしょうか。 現在制作中のプログラムで「葛󠄀󠄀」(下部がヒの字になっている旧字形の葛)の字を描画したい場面があるのですが、 こちらの漢字は2004年にJIS例示字形が改定された影響で、そのまま文章を入力すると新字形になってしまいます。 この問題への対策として、現在はIVS異体字セレクタが多く用いられています。 先ほどの「葛」の字の場合、文字の直後に異体字セレクタ(U+E0100)を入力することで、字形変更前の文字を表示できるようになります。 新字形:U+845B 旧字形:U+845B + U+E0100 新字形(明示):U+845B + U+E0101 3.21b時点ではこの異体字セレクタに対応しておらず、異体字セレクタを含めた状態でも新字形で描画されます。 以下サンプルコードです(VSのプロジェクト設定でUnicode文字セットを使用する必要があります) ----- コード開始 ----- int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); DxLib_Init(); int fontHandle = CreateFontToHandle(_T("Meiryo"), 32, 0, DX_FONTTYPE_ANTIALIASING_4X4); TCHAR noivs[] = _T("葛"); // 異体字セレクタなし(新字形) TCHAR ivs[] = _T("葛󠄀"); // 異体字セレクタあり(旧字形) DrawStringToHandle(0, 0, noivs, GetColor(0xFF, 0xFF, 0xFF), fontHandle); DrawStringToHandle(0, 32, ivs, GetColor(0xFF, 0xFF, 0xFF), fontHandle); WaitKey(); DxLib_End(); return 0; } ----- コード終了 -----
メンテ

Page: 1 |

Re: IVS(漢字異体字シーケンス)への対応について ( No.1 )
名前:Citrine 日時:2019/11/22 22:24

上手く表示できてないですね… スレッド上で「󠄀」になっている部分が異体字セレクタで、 実際に入力する場合は日本語入力状態で「e0100」と入力して[F5]キーを押すと入力できます。
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.2 )
名前:管理人 日時:2019/11/23 03:25

ご要望承りました すみません、IVSというのを初めて知りました (・・; サロゲートペアには対応していたのですが、IVSは1文字目は通常のUnicodeで 2文字目にIVSのコードが入っているのですね… こちらのスレッドの https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4750 名無三さんからのご依頼( と、バグの対応 )を優先しますので少しお時間を頂くかもしれません
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.3 )
名前:Citrine 日時:2019/11/24 02:05

ありがとうございます。気長にお待ちします。
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.4 )
名前:管理人 日時:2019/11/25 01:54

この週末中に異体字セレクタに対応できました よろしければこちらの対応バージョンをお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.5 )
名前:Citrine 日時:2019/11/25 03:49

お早い対応ありがとうございます。早速確認させていただきました。 異体字セレクタが正常に適用された状態で描画できていることを確認できましたが、バグと思わしき挙動に遭遇しました。 Windows標準フォントで縦書き用フォントハンドルを作成し、DrawVString系関数で描画を行うと、 異体字セレクタを使用した文字のみ時計回りに90°回転した状態で描画されます。 当方の環境では以下のフォントで現象を確認しました。 ・MS ゴシック ・MS Pゴシック ・MS UI Gothic ・MS 明朝 ・MS P明朝 ・メイリオ ・Meiryo UI ・游ゴシック ・游明朝 ・Yu Gothic UI ・UD デジタル 教科書体 なお、Noto Sans CJKファミリーや他社製のフォントではこの現象は発生しませんでした。
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.6 )
名前:管理人 日時:2019/11/26 01:07

> Windows標準フォントで縦書き用フォントハンドルを作成し、DrawVString系関数で描画を行うと、 > 異体字セレクタを使用した文字のみ時計回りに90°回転した状態で描画されます。 恐らくですが、フォントが縦書きに対応していないのが原因だと思われます 理由としては ・縦書きできている文字と全く同じ処理をしているのに正しい向きで表示されない ・正しく縦書きされているフォントもある の二つです 縦書きフォントはライブラリ側で文字画像を回転しているのではなく、フォントから取得できる画像自体が 縦書き用になっているものなので、これが縦書きになっていないということは、フォント側に原因がある可能性が高いです
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.7 )
名前:yumetodo 日時:2019/11/26 02:06

あれっ、ちょっとまってください。DxLibは結合文字列に対応しないという話を以前されていたと思うのですが、 ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=3778 今回そこに足を踏み入れた形になりますかね? すると例えばGetDrawStringCharInfoToHandleはどういう振る舞いをするんでしょうか?
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.8 )
名前:管理人 日時:2019/11/27 01:07

> 今回そこに足を踏み入れた形になりますかね? そう言われると確かにそうですね 今のところ異体字( IVS )限定ですが… > すると例えばGetDrawStringCharInfoToHandleはどういう振る舞いをするんでしょうか? 異体字の情報も他の文字と同じように取得することができます
メンテ
Re: IVS(漢字異体字シーケンス)への対応について ( No.9 )
名前:Citrine(解決) 日時:2019/11/29 12:01

確認遅くなりました。 こちらでFontForge等のソフトで標準フォントのグリフ情報を覗いてみましたが、縦書き用の異体字のデータが見当たりませんでした。 管理人様の仰る通り、フォントに起因する問題で間違いなさそうです。 また、yumetodo様が指摘された結合文字の件はIVSに限らず、近年だと絵文字のゼロ幅接合子などの例もあるため、 今後どのような対応を行うか考える機会を設けるのも良いかもしれないですね。 ひとまず私からの要望は実装されましたので、解決とさせていただきます。 ご対応ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存