【C#】Utf8String関連のデザイン動向2018-10-28【C#】Utf8String関連のデザイン動向C#TweetC#のStringが扱う文字コードはUTF-16ですが、UTF-8が広く使われるようになった現状ではUTF-8→UTF-16の変換コストなどがかかりパフォーマンス上の懸念点となっていました。そこで最近のパフォーマンス改善の一環として、C#にUTF-8な文字列を扱えるようにしようという流れがcsharplangやcorefxlabで起き、実際に作業が始まっているようです。Standardなものを作り直そうと考えているのですが、どうせならUTF-16,8両方に対応したいところです。いうわけもあり、Utf8String関連の動向を調べる機会があったので記事に書いておきます。RequestとかあればIssue立てオナシャスm(__)mデザインスペック現在Corefxlabを見ると、Utf8Stringのデザインに関するIssueは2つあります。github.comgithub.com実際の作業はあまり進んでないように見えるので今回はこの2つを眺めながら、どういった実装になるのか推測という感じになります。これ以外にもC#の言語的サポートに関してはcsharplangにIssueが立っています。全般このようなコアなことに関する記事を見る読者の皆様ならだいたい察しがついていることでしょうが、内部的にはReadOnlySpan<byte>やReadOnlyMemory<byte>のようにスライス可能な1バイト数値型を使いたいようです。Wikipediaところで、Wikipediaにも書いていますがUTF-8では1つの文字コードを表すのに8bit=1byteを複数用いて表現します。unitという単位で表現します。unitであるcharに合わせて)Char8という型を用意したいようですが、実態はbyteかsbyteになりそうです。valueというのがあります。valueは含めていないといったもののようです。valueはUnicodeScalarという型として用意するようです。1つ、厄介なことにUnicodeでは複数の文字を連結して1つの文字として扱う場合があります。人の絵文字とかのことですね。それはGraphemeと呼ばれるようですが、デザインスペック的にはサポートする予定はなさそうです。valueを表すUnicodeScalar型ですが、こちらはUTF-8専用ではなくUTF-16の文字も表せるようにするようです。Scalarなんでしょうね。}}Issueのほうからざっくりと抽出してみましたが、このUnicodeScalar型は面白くて、利用者側でSpanを作成し、そこに値を入れるToUtf16とToUtf8メソッドがあります。これを利用していくことになりますが、利用者側は当然、値の長さを知らないといけないので長さを取れるプロパティも実装するようです。パフォーマンスのためにSpanを使うとこうなるのはしょうがないという感じですが、低レベルAPI感をとても感じます。一応仮の実装はされているようなので、貼っておきます。Utf8StringSegmentUtf8Stringの仕様策定の過程で、structがいいとかstructだとつらいとかどうのこうのがあったようですが、最終的にはUtf8String型はクラスとなるようです。そこで、パフォーマンスのために構造体なUtf8StringSegmentも用意するようです。(どのような場面で使用されるかはよくわからなかった)この2つの型ですが、API的にはStringと同じようなものを用意するようです。違う点で言うならばUnicodeScalar型の引数のあるAPIも用意する予定の点。UTF-8を表せる型なので既存のStringにもメソッドが追加されるのではという期待もできるのですが、どうなんでしょうかね。おわりに今回見てきたIssueですが、2つとも6月に立てられてからあまり話が進んでないようでした。Corefxlabには実際にutf8stringというブランチがあるのですがこちらも6月ぐらいからコミットがないようです。最初に載せた自分の作業リポジトリもCorefxlabの動向次第な面があるので放置せざるを得ないのですが、UTF-16の呪縛から逃げれるかと思うと非常に楽しみなのでUtf8Stringが待ち遠しいです。前にC#のUTF-8関連の対応でUnicodeの1文...2019-02-20【Android】DownloadManagerでDLしたファイルをIntentで表示する方法Androidではファイルをダウンロードする方法としてDownloadMana...2019-02-03個人的なコーディングスタイル新年あけましておめでとうございます。meil.スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。