概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Idiosyncratic Ruby: Meta Escape Control
- 原文公開日: 2016/05/30
- 著者: Jan Lelis
- サイト: Idiosyncratic Ruby
RubyのMetaエスケープやControlエスケープを理解する(翻訳)
2重引用符で囲まれた文字列では、お馴染みの式展開(string interpolation)#{}
以外にも、バックスラッシュ\
で始まるさまざまなエスケープシーケンスが利用できます。エスケープシーケンスを使って、生のバイトやコードポイント値を埋め込めます。さらに、よく使われる書式文字や制御文字のショートカットも使えます。
1. バイトシーケンス
生バイトの埋め込みには、\x00
(16進数)または\000
(8進数)の2とおりの方法が使えます。
"\x20" # => " " # スペース文字
"\xab" # => "\xAB" # 値171のバイト
"\033" # => "\e" # エスケープ
"\0" # => "\u0000" # nullバイト
1-1. Metaエスケープ
いわゆるMetaエスケープ構文("\M-x"
、xはバイト値)が使えます。バイト値が128(\x80
)より小さい場合は128を追加し、それ以外の場合は同じ値を返します。言い方を変えると、その値の8ビット目(訳注: 1バイトの最上位ビット)をオンにした値を返します。xの値は再度エスケープされることがあります。
"A".unpack("C") # => [65]
"\M-A".unpack("C") # => [193]
"\M-\x01" # => "\x81"
"\M-\x81" # => "\x81"
訳注: Metaキーを独立して備えているキーボードはあまりありません。スーパーキー(Macだとコマンドキー、WindowsだとWinキー)がMetaキーとして機能することがありますが、アプリによって異なります。上述の「8ビット目を立てる」は、Metaキーの本来の動作とされています。
1-2. Controlエスケープ
Controlエスケープ構文("\C-x"
または"\cx"
、xはバイト値)は、もうひとつのレガシー構文です。値の下位5ビット部分を返すので、値は0〜31となります。値xは再度エスケープされたり、上述のMetaエスケープと組み合わせられることがあります。
"\C-\x01" # => "\u0001"
"\C-!" # => "\u0001"
"\C-A" # => "\u0001"
"\M-\C-A" # => "\x81"
"\C-\M-A" # => "\x81"
2. Unicodeコードポイント
Unicode文字はコードポイント値で表現されます。コードポイント値の数字がわかれば、二重引用符で囲まれた文字列で\u
を用いて埋め込めます。値の16進数は正確に4桁でなければなりませんが、大文字小文字の違いは無視されます。
"\u0020" # => " " # スペース文字
"\u00A0" # => " " # nbsp(ノーブレークスペース)
"\u203d" # => "‽" # interrobang(?と!が重なった特殊文字)
\u
構文では、より柔軟な{}
記法もサポートしています。
"\u{9}" # => "\t" # tab文字
"\u{2602}" # => "☂" # 傘の絵文字
\u{}
構文は、16進数が4桁に収まりきれないコードポイントを表示したい場合に必要です(U+1F6A1 AERIAL TRAMWAY
など)。
"\u{1F6A1}" # "🚡"
複数の文字を一度に指定することもできます。
"\u{49 64 69 6f 73 79 6e 63 72 e4 74 69 63 20 52 75 62 79}"
# => "Idiosyncrätic Ruby"
3. 書式/制御文字
次のエスケープシーケンスは、よく使われる制御文字(control character)や書式文字(formatting character)のバイト値です。
エスケープ表現 | バイト値 | 説明 |
---|---|---|
\a |
7 | ターミナルでベルを鳴らす(ベル文字) |
\b |
8 | バックスペース文字(BS) |
\t |
9 | tab文字(水平タブ) |
\n |
10 | 改行文字(linefeed、LF、newfeed) |
\v |
11 | 垂直tab文字(vtab) |
\f |
12 | フォームフィード文字(FF、ページ送り) |
\r |
13 | キャリッジリターン文字(CR、行頭復帰) |
\e |
27 | エスケープシーケンス開始文字 |
\s |
32 | スペース文字 |