はじめに
以下のようなタイプの YAML データについて考える。
content: なんとか
単一の一要素のハッシュ(マッピング1)があり,キー content
の値が なんとか
になっている。
この なんとか
の部分に制御文字を含めたいときどう書くか,というのがこの記事のテーマ。
たとえば,
なんとか
かんとか
みたいに改行を含む場合とかね。
いやまあ,改行の場合は
content: |-
なんとか
かんとか
という記法が使えるのだが,本記事では制御文字一般に通用する書き方について述べる。
予備知識
本題に入る前にちょこっと復習。
文字列スカラーの表し方
YAML では文字列スカラーを表現する際,引用符に関して以下の 3 とおりの書き方があるのだった:
# 引用符無し
content: なんとか
# ダブルクオート
content: "なんとか"
# シングルクオート
content: 'なんとか'
以上の三つはすべてまったく同じデータを表現している。
しかし,以下の場合は違いが出る:
content: 123 # => 整数
content: "123" # => 文字列
content: '123' # => 文字列
" "
や ' '
で囲めば確実に文字列のスカラーとして扱われるが,囲まない場合,文字の並びによっては数値(整数,浮動小数点数),論理値などに解釈される,ということ。
YAML テキストに使える文字
YAML テキストには,以下に挙げた以外の制御文字は含めることができない。
コードポイント | 名称 |
---|---|
U+0009 | CHARACTER TABULATION(タブ) |
U+000D | CARRIAGE RETURN(CR) |
U+000A | LINE FEED(LF) |
U+0085 | NEXT LINE |
なお,Unicode の制御文字は,U+0000〜U+001F,U+007F,U+0080〜U+009F のみ。
参考(公式ドキュメント):
YAML Ain’t Markup Language (YAML™) Version 1.2 > 5.1. Character Set
文字列スカラーに制御文字を含める方法
ここから本題。
答えを一言で表現すれば「ダブルクオートで囲ってエスケープシーケンスを使えばよい」となる。
つまり,
content: "なんとか\nかんとか"
のように書く。
大事なのは「ダブルクオートで囲む」ということ。シングルクオートで囲った場合や,引用符で囲まなかった場合はエスケープシーケンスとはみなされず \n
という文字そのものと解釈されてしまう。
エスケープシーケンスの一覧は公式ドキュメントのここ
YAML Ain’t Markup Language (YAML™) Version 1.2 > 5.7. Escaped Characters
にある。
面白いのは \_
で U+00A0 NO-BREAK SPACE が表せたりするところ。
バックスラッシュを表すのに \\
と書いたり,ダブルクオートを表すのに \"
と書くあたりは多くのプログラミング言語の文字列リテラルと共通。
文字コードを使うエスケープシーケンスもある(制御文字以外にも使える)。
content: "\x31\u306F\U00029E3D" # "1は𩸽"
こんなふうに,16 進 2 桁は \x
を,4 桁は \u
を,8 桁は \U
を使う。
\u{29E3D}
のような,\u{ }
を用いた表記は無いようだ。
-
YAML の本来の用語は「マッピング」だが,これを「ハッシュ」と呼ぶこともある。Ruby 界隈では(読み取ってできるデータがハッシュになることもあって)ハッシュと表現されることが多い気がする。 ↩