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

Rubyでのエンコーディングの問題を修正するための3つのステップ

文字列が壊れたときだけ、文字列のエンコーディングについて考えます。 例外トラッカーを確認して表示する場合

Encoding::InvalidByteSequenceError: "\xFE" on UTF-8

顔を見つめています。または、「they’re」が「they’re」として表示され始める場合もあります。

それで、あなたが悪いエンコーディングを持っているとき、あなたはどのように何が壊れたかを理解しますか?そして、どうすればそれを修正できますか?

エンコーディングとは何ですか?

エンコーディングが文字列に対してどのように機能するかを想像できる場合、これらのバグは簡単に修正できます。

文字列は、バイトの配列または小さな数値と考えることができます。

irb(main):001:0> "hello!".bytes
=> [104, 101, 108, 108, 111, 33]

このエンコーディングでは、104 hを意味します 、33 !を意味します 、など。

英語ではあまり一般的ではない文字を使用すると、注意が必要になります:

irb(main):002:0> "hellṏ!".bytes
=> [104, 101, 108, 108, 225, 185, 143, 33]

今では、どの数字がどの文字を表しているのかを判断するのが難しくなっています。 1バイトではなく、 バイトのグループで表されます[225, 185, 143] 。ただし、バイトと文字の間にはまだ関係があります。 そして文字列のエンコーディングがその関係を定義します。

さまざまなエンコーディングを試したときに、1セットのバイトがどのように見えるかを見てみましょう。

# Try an ISO-8859-1 string with a special character!
irb(main):003:0> str = "hellÔ!".encode("ISO-8859-1"); str.encode("UTF-8")
=> "hellÔ!"

irb(main):004:0> str.bytes
=> [104, 101, 108, 108, 212, 33]

# What would that string look like interpreted as ISO-8859-5 instead?
irb(main):005:0> str.force_encoding("ISO-8859-5"); str.encode("UTF-8")
=> "hellд!"

irb(main):006:0> str.bytes
=> [104, 101, 108, 108, 212, 33]

バイトは変更されませんでした。しかし、それはまったく正しく見えません。エンコーディングを変更すると、バイトを変更せずに文字列の印刷方法が変更されました。

すべての文字列をすべてのエンコーディングで表現できるわけではありません

irb(main):006:0> "hi∑".encode("Windows-1252")
Encoding::UndefinedConversionError: U+2211 to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252
	from (irb):61:in `encode'
	from (irb):61
	from /usr/local/bin/irb:11:in `<main>'

ほとんどのエンコーディングは小さく、すべての可能な文字を処理できるわけではありません。あるエンコーディングの文字が別のエンコーディングに存在しない場合、またはRubyが2つのエンコーディング間で文字を変換する方法を理解できない場合に、このエラーが表示されます。

追加のオプションをencodeに渡すと、このエラーを回避できます。 :

irb(main):064:0> "hi∑".encode("Windows-1252", invalid: :replace, undef: :replace)
=> "hi?"

invalid およびundef オプションは、翻訳できない文字を別の文字に置き換えます。デフォルトでは、その置換文字は?です。 。 (Unicodeに変換すると、それは�です。)

残念ながら、文字をencodeに置き換えると 、情報が失われる可能性があります。 どのバイトが? 。ただし、データをその新しいエンコーディングにする必要がある場合は、データを失うことは、データが壊れることよりも優れている可能性があります。

これまで、エンコーディングを理解するのに役立つ3つのキー文字列メソッドを見てきました。

  • encode 、文字列を別のエンコーディングに変換します(新しいエンコーディングで文字を同等のものに変換します)

  • bytes 、文字列を構成するバイトが表示されます

  • force_encoding 、これらのバイトが別のエンコーディングで解釈されたように見えるかどうかが表示されます

encodeの主な違い およびforce_encoding そのencode bytesを変更する可能性があります 、およびforce_encoding しません。

エンコーディングのバグを修正するための3ステップのプロセス

ほとんどのエンコーディングの問題は、次の3つの手順で修正できます。

1。文字列が実際にどのエンコーディングであるかを確認します in。

これは簡単に聞こえます。 しかし、文字列が言う これは何らかのエンコーディングであり、実際にそうであるという意味ではありません:

irb(main):078:0> "hi\x99!".encoding
=> #<Encoding:UTF-8>

そうではありません–もしそれが本当に UTF-8には、その奇妙なバックスラッシュ番号は含まれていません。では、どのようにして文字列の正しいエンコーディングを見つけますか?

古いソフトウェアの多くは単一のデフォルトエンコーディングに固執するため、入力がどこから来たのかを調べることができます。誰かがWordから貼り付けましたか? Windows-1252である可能性があります。それはファイルからのものですか、それとも古いWebサイトから取得したものですか? ISO-8859-1の可能性があります。

リンクされたウィキペディアのページにあるようなエンコーディングテーブルを検索することも役立つことがわかりました。 これらのテーブルで、不明な番号によって参照されている文字を検索し、それらが文脈上意味があるかどうかを確認できます。

この例では、Windows-1252チャートは、バイト99を示しています。 「™」文字を表します。バイト99 ISO-8859-1では存在しません。ここで™が意味をなす場合は、入力がWindows-1252であると想定して、次に進むことができます。それ以外の場合は、より合理的に見えるキャラクターが見つかるまで調査を続けることができます。

2。 必要なエンコーディングを決定します ある文字列。

これは簡単です。本当に正当な理由がない限り、文字列をUTF-8でエンコードする必要があります。

Rubyで使用する可能性のあるもう1つの一般的なエンコーディングは、ASCII-8BITです。 ASCII-8BITでは、すべての文字が1バイトで表されます。つまり、str.chars.length == str.bytes.length 。したがって、文字列内の特定のバイトを細かく制御したい場合は、ASCII-8BITが適切なオプションになる可能性があります。

3。手順1のエンコードから手順2のエンコードに文字列を再エンコードします。

これは、encodeを使用して行うことができます 方法。この例では、文字列はでした Windows-1252エンコーディングで、欲しい UTF-8になります。非常に簡単です:

irb(main):088:0> "hi\x99!".encode("UTF-8", "Windows-1252")
=> "hi™!"

ずっといい。 (その呼び出しでのエンコードの順序は常に逆に見えましたが)

同じバイト配列の異なる解釈を想像するのは頭がおかしいかもしれません。 特に それらの解釈の1つが壊れたとき。 しかし、エンコーディングをより快適にするための優れた方法があります。エンコーディングで遊んでください。

irbを開きます コンソール、およびencodeをいじります 、bytes 、およびforce_encodingencodeの方法をご覧ください 文字列を構成するバイトを変更します。さまざまなエンコーディングがどのように見えるかについての直感を構築します。エンコーディングに慣れてきて、これらの手順を使用すると、数時間前にかかっていたものを数分で修正できます。

最後に、このようなことを学ぶことで習慣を身に付ける方法を学びたい場合は、私の本の無料のサンプルの章を入手してください。 コンソールで物事を壊すことは本当に このようなアイデアを学ぶ楽しい方法。


  1. Windows 10 Update の問題を解決する方法

    このトラブルシューティング ガイドには、更新プログラムのダウンロード中またはインストール中のエラーや、Windows 10 を最新バージョン (ビルド) にアップグレードする際に発生する可能性があるその他の問題など、Windows 10 Update の問題をユーザーが修正するのに役立ついくつかの方法が含まれています。 多くの Windows 10 PC 所有者は、新しい重要な Windows 10 更新プログラムのインストール中にいくつかの問題に直面し、ほとんどの場合、「何かが起こった - Windows 10 のインストールに失敗しました」または「Windows 10 の機能更新プログラ

  2. Windows 10 で Bluetooth の問題を解決する方法

    Bluetooth を使用すると、配線を必要とせずに Windows 10 デバイスとアクセサリを PC に接続できます。ほとんどの場合、Bluetooth は Windows 10 で正常に動作します。ただし、動作しない場合は、Windows 10 PC で Bluetooth 接続をトラブルシューティングするための手順を以下に示します。 1. Bluetooth が有効になっているかどうかを確認します 当然の手順のように思えますが、Bluetooth 設定をトラブルシューティングするための最も簡単な方法を確認し忘れることがあります。 Windows 10 デスクトップの右下にある Win