Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

RubyのMetaエスケープやControlエスケープを理解する(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。


idiosyncratic-ruby.comより

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 スペース文字

関連記事

Unicodeで絶対知っておくべきセキュリティ5つの注意(翻訳)

Rubyの内部文字コードはUTF-8ではない…だと…?!

Rubyの文字列連結に「#+」ではなく式展開「#{}」を使うべき理由


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。