トップページ > 記事閲覧
C++20のchar8_tへの対応
名前:yumetodo 日時: 2019/12/07 17:43

C++20ではUTF-8エンコーディングされた文字の型としてchar8_tを追加しました。 ref: ttps://cpprefjp.github.io/lang/cpp20/char8_t.html すでにgcc, clang, msvcでは実装が終わっていて使える状況にあります。 このとき、C++11で追加された文字列へのu8 prefixを使っているユーザー側のコードが動かなくなります。 例えばつぎのコードはMSVCでは/std:latestでは動きません(VS16.1から)(話逸れますがAddSubstitutionFontToHandle便利ですね、こういうとき)。 #include <DxLib.h> int WINAPI WinMain(HINSTANCE , HINSTANCE , LPSTR , int ) { ChangeWindowMode(true); if (DxLib_Init() == -1){ return -1; } const auto font_handle_yu_goshic = CreateFontToHandle("游ゴシック", -1, -1, DX_FONTTYPE_ANTIALIASING); const auto font_handle_segoe_ui_emoji = CreateFontToHandle("Segoe UI Emoji", -1, -1, DX_FONTTYPE_ANTIALIASING); AddSubstitutionFontToHandle(font_handle_yu_goshic, font_handle_segoe_ui_emoji, 0, 0); SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); DrawStringToHandle(10, 10, u8"aあ&#127843;&#127866;", GetColor(0xFF, 0xFF, 0xFF), font_handle_yu_goshic); WaitKey(); DxLib_End(); return 0; } これを回避するには #if defined(__cpp_char8_t) && 201803 <= __cpp_char8_t DrawStringToHandle(10, 10, reinterpret_cast<const char*>(u8"aあ&#127843;&#127866;"), GetColor(0xFF, 0xFF, 0xFF), font_handle_yu_goshic); #else DrawStringToHandle(10, 10, u8"aあ&#127843;&#127866;", GetColor(0xFF, 0xFF, 0xFF), font_handle_yu_goshic); #endif のようなコードが必要になりますが、static_castではなくreinterpret_castが必要になりますし、 またそもそもchar8_tの追加背景はUTF-8の保証にありますので、 char8_t型の場合、SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8);なしでUTF-8として扱えるべきだと思います。 そこで、201803 <= __cpp_char8_tのときにchar8_tを渡せる版の関数を追加してほしいです。 (__cpp_char8_tはC++標準で定められた機能テストマクロで、MSVC含め使えます) 少なくとも文字列描画系関数は対応が必要ですが、ほかにどこまで対応が必要かは把握できていません。 現状長さ保証版 ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4243 が追加されている中で組合せ爆発しそうではありますが、対応しないというわけにもいかないかなと思います。
メンテ

Page: 1 |

Re: C++20のchar8_tへの対応 ( No.1 )
名前:yumetodo 日時:2019/12/07 18:12

む、絵文字がこの掲示板で扱えないだと・・・? 仕方ないのでGithubに上げました ttps://github.com/yumetodo/DxLibUTF8Test/blob/master/DxLibUTF8Test/DxLibUTF8Test.cpp
メンテ
Re: C++20のchar8_tへの対応 ( No.2 )
名前:管理人 日時:2019/12/08 22:50

うーん、対応はもう少し様子を見てからですかね… u8 もそうですが、また仕様が変わるかもしれませんし… (・・;; > む、絵文字がこの掲示板で扱えないだと・・・? 20年近く前の掲示板ですから対応していないのかも… ( 文字は EUC-JP に変換されて保存されるようです )
メンテ
Re: C++20のchar8_tへの対応 ( No.3 )
名前:yumetodo(pending) 日時:2019/12/08 23:45

C++20発行までにこれ以上動くとは思いませんが、まあC++20が正式に出たらまた声かけることにします。 > ( 文字は EUC-JP に変換されて保存されるようです ) あややや
メンテ

Page: 1 |

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

   クッキー保存