1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

YAML 中で制御文字を表現する方法

Posted at

はじめに

以下のようなタイプの 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{ } を用いた表記は無いようだ。

  1. YAML の本来の用語は「マッピング」だが,これを「ハッシュ」と呼ぶこともある。Ruby 界隈では(読み取ってできるデータがハッシュになることもあって)ハッシュと表現されることが多い気がする。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?