Closed16

C++20 以降向けの Unicode ライブラリを作りたい

yaito3014yaito3014

取り敢えずの指針

  • バックエンドとインターフェースを切り離したい
    • ICU をデフォルトのバックエンドに
      • 基本的に ICU4C に乗っかりたい
    • 適宜オレオレ実装をねじ込めるようにする
yaito3014yaito3014

locale みたいなクラスが生えてくるのはしょうがないとして、char が前提みたいなお行儀のよろしくないものにはしない

yaito3014yaito3014

取り敢えず先駆者としての std::locale boost::locale boost::text をざっくり見ていく

yaito3014yaito3014

std::locale について
std::locale から得られるファセットの殆どは CharT とテンプレート引数を取っているが1コードポイントに対して1コードユニットでないとまともに動かない設計
それでいて std::cout などの根幹に関わっているので改修は最早不可能

yaito3014yaito3014

boost::locale について
boost::locale::generator なる物を介して std::locale をオレオレファセットを追加した状態で作ってくる

Experimental support for C++11 char16_t and char32_t strings and streams.

とか言ってるし char8_t への対応なんてないのでモダンC++には適さなそう

saki7saki7

モダンなインターフェースを備えた新規ライブラリが作られるなら個人的に優先度高めで欲しい機能

  • 符号化方式同士の変換 (UTF-8 / UTF-16 / UTF-32)
  • char / wchar_t から UTF-8 / UTF-16 / UTF-32 への変換
  • normalization(NFC, NFD, NFKC, NFKD)
  • grapheme単位で走査できるiteratorとrange
  • Unicodeにおける文字カテゴリを取得する機能
  • Unicodeにおけるその文字の名前を取得する機能(デバッグにあると便利)

Unicodeのnormalizationはあまり知られていない概念だと思いますが、これめちゃくちゃ使います。例えばブログ記事や小説原稿など人力で書かれているテキストデータの表記ゆれ統一や、データレベルでの整形に必要な機能です。また、身近な例では、Macで作ったファイルがmacOSのバージョンによっては開けなくなったり、Windowsに持って行ったり圧縮ファイルに固めるとファイル名(パス)がめちゃくちゃになる問題が有名。 https://applech2.com/archives/20230402-nfd-and-nfc-issues-in-macos-13-3-ventura.html

文字コードライブラリとしては、任意の文字コードと相互変換できる機能が基本に感じますが、デスクトップアプリではその手の処理をやらないことが増えています。少なくとも私は過去3年くらい書いていません。(アセット類は事前にUTF-8に変換しておくのが世の中のセオリーなので、アプリを起動してから文字コードを動的に変換するニーズが消滅した)(つまり、Unicodeの世界の処理を充実させた方がよく、それ以外の文字コードを使うのは稀)

ロケール周りは正直使わないです(というか、ロケールに一切依存せず文字コードやUnicode符号化方式をいじれるコードパスを用意してほしい)

saki7saki7

素朴に知りたいんですけど、総評としてBoost.Textは使い物になるんですかね?

yaito3014yaito3014

テストの体制は整っている ように見えますし MSVC の CI で落ちているらしいのが何とかなれば boost::locale よりかはマシなんではないでしょうか
(レンジアダプタの実装まわりが渋いのは C++17 イテレータでゴネゴネしていた人々からすればまだ妥協できるポイントだと思っています)

yaito3014yaito3014

Boost.Text をベースに、もうちょっとマシにした実装を目標とする

yaito3014yaito3014

それはそれとして実際に実装するモチベが低迷しているのでそれなりの形になってきたらスクラップを立て直す

このスクラップは2023/05/09にクローズされました