Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyを理解する:文字列エンコーディング、ASCII、Unicode

コンピューターが1と0しか理解できない世界で、文字列はどのように存在するのでしょうか?

まあ…

ドメイン名をIPアドレスにマッピングできるのと同じように。

または特定の製品のバーコード。

できる…

数字を文字にマッピングしてください!

97のように "a"へ 。

または122 "z"へ 。

まさにそれが、数字の世界でキャラクターを持つことができる方法です。

しかし、どの数字がどの文字に合うのでしょうか?

その質問に答えるために、さまざまな文字マッピングシステムを発明しました。

ASCIIから始めます。

ASCIIは、「情報交換のための米国標準コード」の略です。

ASCIIテーブルを見つけるか、Rubyに文字をASCII値に変換するように依頼できます。

このように

"a".ord
# 97

複数のキャラクターの場合

"abc".bytes
# [97, 98, 99]

整数を使用している場合は、関連する文字を取得できます。

このように

97.chr
# "a"

ASCIIエンコーディングにはが含まれます :

  • 制御文字(改行、タブ、nullなど)
  • 記号(括弧、等号、疑問符など)
  • 数字(0〜9)
  • 文字(a-z、A-Z)

この記事の後半で説明するように、この文字の範囲は制限されています。

なぜですか?

中国語や日本語などの他の言語の文字や記号が含まれていないためです。

実世界のASCII

この数字から文字列へのマッピング全体は、舞台裏で行われます。

しかし、いくつかの実用的な用途があります!

HTTP仕様では、URL内の特定の文字は許可されていません。

ただし、これらの無効な文字をASCII形式でエンコードすると、最新のWebサーバーのほとんどが正しく解釈します。

example.com/a+++ => example.com/a%2B%2B%2B

%2Bとは ?

+の文字です 、ASCIIエンコード形式。

この知識を使用して、文字を変換することもできます。

ASCIIテーブルを見ると、小文字から32を引くことで、小文字を大文字に変換できることがわかります。

("a".ord - 32).chr
# "A"

それは逆にも機能します。

("A".ord + 32).chr
# "a"

はい。

Rubyには、upcaseがあります。 &downcase メソッド。

しかし、これは、ある種の面接の質問、コーディングの課題、または同様の状況で役立つ可能性があります。

Unicodeとは何ですか?

ASCIIは、最大127の異なる文字(拡張ASCIIでは256)しかエンコードできません。これにより、表現できる文字が制限されます。

解決策は?

Unicode。

Unicodeは文字列エンコーディングシステムです 最大100万の異なる文字を表すことができます 。

これはASCIIよりもはるかに広いスペースです!

これで、あらゆる種類の言語の文字、新しい記号、さらには絵文字を含めることができます。

ここにいくつかのUnicodeがあります

ɑΩϕβΣπ

これらは、ASCIIを使用して表示できないギリシャ文字の文字です。

RubyでUnicodeを使用する方法

RubyはUnicodeをサポートしており、Ruby1.9以降はデフォルトで有効になっています。

これができるように

π = 3.141592

またはこれ

def ★★★
  puts "You get 3 stars, great job!"
end

★★★
# "You get 3 stars, great job!"

とても楽しいです!

ただし、これらの記号はキーボードにないため、これらの記号を使用してメソッドと変数を定義するのはおそらくそれほど実用的ではありません。

実際、有効で目に見えないUnicode文字があります。

def ​
  puts "Invisible method"
end
​

これは名前のないメソッドのように見えますが、通常は許可されていません。

しかし、それはその目に見えないUnicode文字のために機能します!

文字列エンコーディングメソッド

Rubyには、さまざまなエンコーディングシステムを操作するためのメソッドがあります。

"abc".encoding.name
# "UTF-8"

現在のエンコーディングが発生する特別なシナリオがいくつかあります (encoding.name実際のエンコーディングと一致しません 文字列の。

これは、Webサイト、ファイル、データベース、または別の外部ソースからデータを読み取るときに見つけることができます。

これにより、InvalidByteSequenceErrorが発生します 。

その場合は、エンコーディングを変更する必要があります

どうやって?

encodeを使用する 方法:

"abcΣΣΣ".encode("ASCII", "UTF-8", undef: :replace)

# "abc???"

UTF-8(Unicode)から変換しています ASCII 、およびΣ 文字はASCIIで使用できないため、Rubyに置き換えるように指示します。

デフォルトでは、これにより未定義の文字が疑問符に置き換えられます。

しかし、それは変更できます。

このように

"abcΣΣΣ".encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "")

# "abc"

または「フォールバック」オプションを使用する

"abcΣΣΣ".encode("ASCII", "UTF-8", fallback: {"Σ" => "E"})

# "abcEEE"

これは言っています

「すべての文字をUTF-8(Unicode)からASCIIに置き換え、フォールバックハッシュを使用して、ASCIIに存在しない文字を変換します。」

別のメソッド、force_encoding 、この変換ステップなしでエンコーディングを変更します。

"abc½½½".force_encoding("iso-8859-1")

Encoding.aliasesを使用して、使用可能なエンコーディングのリストを取得できます。 メソッド。

概要

コンピューターがエンコードテーブルを使用して数字から文字を作成する方法を学びました。 RubyでのASCIIとUnicodeについても学びました。

エディターを開いて、練習を楽しんでください😃

読んでくれてありがとう。


  1. Rubyでの挿入ソートを理解する

    注:これは、Rubyを使用したさまざまなソートアルゴリズムの実装を検討するシリーズのパート4です。パート1ではバブルソート、パート2では選択ソート、パート3ではマージソートについて説明しました。 データを並べ替えるためのさまざまな方法を引き続き検討するため、挿入並べ替えに目を向けます。挿入ソートが好きな理由はたくさんあります!まず、挿入ソートは安定です。 、これは、等しいキーを持つ要素の相対的な順序を変更しないことを意味します。 インプレースアルゴリズムでもあります 、は、並べ替えられた要素を格納するための新しい配列を作成しないことを意味します。最後に、挿入ソートは、すぐにわかるように、実

  2. Ruby文字列のフォーマット

    Rubyで文字列をフォーマットする方法について話しましょう。 なぜ文字列をフォーマットしたいのですか?数値が10未満であっても、先行ゼロを使用したり(例:01、02、03…)、コンソール出力を列に適切にフォーマットしたりすることができます。 他の言語では、 printfを使用できます 文字列をフォーマットする関数です。Cを使用したことがある場合は、おそらくそのことに精通しているでしょう。 printfを使用するには フォーマット指定子のリストと変数または値のリストを定義する必要があります。 Ruby文字列フォーマット入門 sprintf はRubyでも利用できます。この投稿では、よ