概要
- Unicode を使う場合、全ての文字を許可すべきではないという指摘
- RFC 9839 が問題のあるUnicode文字と推奨されるサブセットを定義
- JSONなどのデータ構造設計時に 問題文字の除外 が重要
- PRECIS (RFC 8264)は網羅的だが複雑で普及が進んでいない
- RFC 9839は 実装しやすい簡易な指針 を提供
Unicode利用時の問題点とRFC 9839の概要
- Unicode はテキストフィールドの標準として推奨
- しかし、 全てのUnicode文字 を許可するのは危険
- RFC 9839 は「問題のある文字」を定義し、除外すべき理由を解説
- 3種類の 推奨サブセット を提示し、実装時の参考に最適
- RFCは 10ページ と短く、ソフトウェア・ネットワーク技術者向けに記述
問題となるUnicode文字の具体例
- U+0000 :ヌル文字。多くのプログラミング言語で誤動作の原因
- U+0089 :C1制御文字。用途不明で多くのシステムで扱い困難
- U+DEAD :非対のサロゲート。UTF-8ではエンコード禁止
- U+7FFFF :ノンキャラクター。通信で利用禁止
- これらのコードポイントは 相互運用性やセキュリティの問題 を引き起こす
JSON・他フォーマットでの問題
- JSON 仕様は上記の問題文字も許可してしまう
- JSON設計者のDoug Crockfordも 現代なら制限したはず との見解
- 既存仕様のため、 プロトコル実装側で明示的に除外 する必要
- 他のデータ形式(CBOR, TOML, XML, YAMLなど)も 対応状況はまちまち
PRECISとの比較
- PRECIS(RFC 8264) は広範囲かつ詳細な文字セット規定
- しかし 複雑さ・バージョン依存 が普及の障壁
- Unicodeの新バージョン対応や アプリケーション間の整合性維持が困難
- RFC 9839 はシンプルかつ実用的な選択肢を提供
RFC 9839のサブセットと実装例
-
RFC 9839は 3つのサブセット (Scalars, XML, Assignables)を定義
-
それぞれ どの問題文字を除外するか を明確化
-
Go言語向けの 検証ライブラリ も公開(最適化・バージョン管理は今後)
-
サブセットごとの対応状況を 表形式で整理
- Surrogates, Legacy controls, Noncharactersの各除外有無
- CBOR: サロゲート除外
- I-JSON: サロゲート・ノンキャラクター除外
- JSON: いずれも未対応
- XML/YAML: 一部対応
- Surrogates, Legacy controls, Noncharactersの各除外有無
RFC 9839策定の経緯と教訓
- 多数の有識者による 議論・改善 を経て公開
- 個人提出RFCは 大変だが価値あり、ただしWorking Group経由の方が効率的
- 今後、 新しいデータ構造やプロトコル設計時にはRFC 9839の参照が推奨
まとめ
- テキストフィールド設計時はUnicodeの「問題文字」除外が必須
- RFC 9839 を活用し、 安全・互換性の高い実装 を推進
- 仕様策定時の明確な根拠 としてRFC 9839の引用が有効