Docurain Labo

Docurainサービス開発日記

異体字セレクタも出力可能です

以前、Docurainが「外字」に対応済みであることをお知らせしましたが、Docurainは異体字セレクタ(IVS)にも対応*1しました。

blog.docurain.jp

異体字セレクタ(IVS)とは

Ideographic Variation Sequence(異体字シーケンス)の略称で、異体字の関係に
ある文字に「異体字セレクタ」(VS / Variation Selector)というコード(枝番号)
を振ることで、より確実な文字情報の交換を可能にする技術のこと

ja.wikipedia.org

使用例

例えば、「尊」の異体字である

は対応するセルのフォントをIPAmj明朝にした上で、以下のようなJSONで表示できます。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-19.06.11.png{ "str": "尊\uDB40\uDD04" } または { "str": "尊\\U+E0104" }

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-19.05.11.png{ "str": "尊\uDB40\uDD05" } または { "str": "尊\\U+E0105" }

Docurain独自の記述方法

上記 https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-12-19.06.11.png のIVS(右側)について、本来であれば

{ "str": "尊\U+E0104" }

\(バックスラッシュ)は一つになるべきですが(実際これでもDocurainでは動きますが)、これはJSONエディタではエラーに判別され開発時に扱いづらいため、独自に { "str": "尊\\U+E0103" } でも受付可能にしました。

異体字セレクタ(IVS)のデータで出力してみよう

テンプレート・JSONは以下のように作成しています。
サンプルはこちらからダウンロードできます。

  • テンプレート https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-13-15.25.17.png

  • JSON(IVSで記述)

{
  "str1": "\\U+E0103",
  "str2": "\\U+E0104",
  "str3": "\\U+E0105",
  "str4": "\\U+E0101",
  "str5": "\\U+E0100",
  "str6": "\\U+E0103",
  "str7": "\\U+E0101",
  ...省略...
}

出力結果は以下のようになります。

https://s3.ap-northeast-1.amazonaws.com/site.docurain.jp/blog/2021/01/スクリーンショット-2021-01-13-15.34.50.png

問題なく出力されていますね。

IPAmj明朝の文字一覧に存在するIVSの1万1,382文字は全て検証済みで出力可能です!

異体字セレクタ込みの文字列操作も簡単に

サロゲートペアを扱ったことがある方でしたらご存じの通り、 サロゲートペアが含まれた文字列は、もはや通常の「文字列」として扱うことができません。 なぜなら、サロゲートペアは「2文字で『1文字』を表す」という特殊な文字だからです。

例えば🍣や🍺はサロゲートペアです。なので、

"🍣と🍺".length

とJavascriptで実行すると、3ではなく5が返ってくるあたりで辛さがわかると思います。

先頭の1文字を切り取ろうとして、

"🍣と🍺".substring(0, 1)

とやると、"�"という壊れた文字が返ってくる*2わけです。ましてや、IVS文字は「3文字で『1文字』を表す」という世界なので、例えば

"🍣と🍺と䄂\uDB40\uDD01".length

9になるわけです。表示結果は5文字*3なのに。辛い。

そこでDocurainでは、ユニコード専用の文字列操作を用意しています。 JSONで送ったデータの文字列オブジェクトのメソッドとして呼び出すことができます。

関数名 説明
u_length ユニコードを考慮した文字列長を返す。サロゲートペアおよび異体字セレクタの文字は1文字とカウントする。例えば"🍣と🍺と䄂\uDB40\uDD01"の長さは5とカウントする。
u_charAt(int index) ユニコードを考慮した文字取得メソッド。オリジナルのString#charAtとは異なり、このメソッドの戻り値は「1文字」を表す文字列になる。サロゲートペアおよび異体字セレクタの文字は1文字とカウントする
u_toCharArray() ユニコードを考慮して文字列を文字に分解する。オリジナルのString#toCharArrayとは異なり、このメソッドの戻り値は「1文字」を表す文字列の配列になる。サロゲートペアおよび異体字セレクタの文字は1文字とカウントする。
例えば`'🍣と䄂\uDB40\uDD01'`.u_toCharArray()の結果は["🍣","と","䄂\uDB40\uDD01"]になる
u_substring(int from), u_substring(int from, int to) ユニコードを考慮した部分文字列取得メソッド。サロゲートペアおよび異体字セレクタの文字は1文字とカウントする
u_hasIVS() 異体字セレクタを含む文字列か判定する
u_removeIVS() 異体字セレクタを除去して通常の字体のみにする

最低限必要なものは用意しましたが、不足がありましたら随時追加していきます。



今回作成したサンプルは、無料トライアルページからも登録不要で試してみることが出来ます。 外字・異体字を扱う帳票の作成・出力が必要な際はぜひ試してみてください!

他にも様々な機能がありますので、ぜひアカウント無料登録してマニュアルを参照しお試しください。

*1:「対応しました」というか、元々IVSは対応済みだったのですが、完全対応済みであることを改めて検証しました

*2:サロゲートペアを構成する2文字の先頭の1文字だけを切り取っているから

*3:正確には「グリフ5個が表示される」