Unclazz.Commons.Jsonライブラリv1.2.1リリース
昨年11月に公開したJSONパーサー(かつシリアライザ) Unclazz.Commons.Jsonライブラリ のバージョン1.2.1をリリースしました。
このリリースでは以下の2つのバグフィックスを行っています:
- Stringリテラルに含まれるCRLFなどのエスケープシーケンスを正しく処理できない問題の解消
- Stringリテラルに含まれるUnicodeエスケープシーケンス(サロゲートペア含む)をサポートできていない問題の解消
余談 - サロゲートペア問題
ところで、目的はあくまでバグフィックスだったのですが、とくに2点目のUnicodeエスケープシーケンスのサポート追加はいくつかの点で勉強になりました:
- UTF-16ではUnicodeの拡張領域に含まれる文字を表現するためサロゲートペアという4バイトを使用する(それ以外は2バイト)
- JavaやC#のようなやや旧世代の言語では文字列はUTF-16で表現されている
- これらの言語における文字型(char)はその定義からしてサロゲートペアを扱うにはキャパシティが足りない(Javaでは概念として「文字」と「コードポイント」を分けており後者はサロゲートペアを含む)
- これらの言語における文字列型(String)リテラルで拡張領域に含まれる文字をUnicodeエスケープシーケンスで表現する場合
\uXXXX\uXXXX
(XXXXは左ゼロ詰め4桁固定16進数値)という記法をとる - これは「あたかも2文字であるように記述する」とも読めるが実際上その長さ(Javaでは
String#length
、C#ではString#Length
)をとると2文字分に該当する - 「(Python3の)文字列はUnicode文字のシーケンスだ」というとき含意されているのはこうしたUTF-16に依拠する実装をとる前世代に対する優位性である
参考にした記事:
- Unicode メモ - C#練習日記 … サロゲートペアの整数値から文字(というか文字列)に変換する方法を学びました。
- CodeZine - サロゲートペア入門…サロゲートペアの概念について学びました。加えて上記記事とあわせてサロゲートペアの整数値を文字に変換する方法を学びました。
- Dive Into Python 3 日本語版 - 第2章 ネイティブデータ型…上述のPython3に関する記述から今回の問題の示唆を受けました。
- hydroculのメモ > プログラミング言語の比較 > 文字列 > Unicode拡張領域の取り扱い…Java、Python、JavaScriptなどの比較がなされていてわかりやすいです。
2016年11月の記事: