4

「Ruby プログラミング言語」を読んでいます。セクション 3.2.6.1「Ruby 1.9 のマルチバイト文字」では、Ruby の文字列の最適化が紹介されています。

文字列リテラルに 7 ビット ASCII 文字のみが含まれる場合、ソース エンコーディングが UTF-8 であっても、エンコーディング メソッドは ASCII を返します。

Ruby 1.9.1-p431、1.9.2、および 1.9.3-p125 の両方で次の簡単なスクリプトを試してみました。どちらも 7 ビット ASCII 文字に UTF-8 エンコーディングを使用しています。

# coding: utf-8
s = 'hello'
p s.encoding
# result is #<Encoding:UTF-8>

Ruby 1.9 の開発中にこの動作が変更されたのかもしれません。Ruby 1.9 の変更ログを検索しようとしましたが、1.9.1 の変更ログでこの動作が確認されました。また、Ruby の git リポジトリのクローンを作成しましたが、この動作の変更について言及しているコミットが見つかりません。

アップデート:

Ruby のソース コード リポジトリを見ると、2008 年 1 月にリリースされた Ruby 1.9.0 での動作だと思います (Debian 6 ではコンパイルに失敗したため、正確には確認できません) 。 Language" は優れた本で、もともとは 2008 年に出版されたものです。本の説明が古くなっている可能性が非常に高いです。

別の時代遅れの説明は、Encoding.listメソッドの動作に関するものです。したがって、この本も読んでいる場合は、古い説明に注意してください。

4

2 に答える 2

4

私はその本を持っていませんが、プログラミング Ruby の本 (つるはし) の現在の Pdf バージョンには次のように記載されています。

文字列リテラルは、文字列の内容に関係なく、それらを含むソース ファイルのエンコーディングを使用して常にエンコードされます。

"dog"次に、utf-8 エンコーディングを取得する例を示します。お持ちの本の版が間​​違っているようです。それがあなたの本の印刷版の正誤表なのか、単に印刷後にルビが変更されたという事実なのか、私にはわかりません。

于 2012-04-25T12:12:01.627 に答える
2

Rubyでの「エンコーディング」は、実際に格納されているバイトよりも「解釈」を指すことが多いことに注意してください。エンコーディングがUTF-8であると言う場合、それはその文字列のバイトがUTF-8マルチバイト文字として解釈されることを意味しますが、UTF-8は設計上7ビットASCIIと下位互換性があるため、バイナリレベルでの明らかな違いはありません。

これを決定するための標準的な方法や信頼できる方法がないため、Rubyは文字列のエンコードを自動的に検出しません。これが、作成または変換時に明示的に指定されていない限り、デフォルトのエンコード方法がすべての文字列に適用される理由です。

を使用して、格納されているバイトを実際に変更せずに、文字列のエンコーディングを切り替えることができますforce_encoding。を使用して、別の形式に変換し、保存されているバイトを再マッピングすることもできますencode

文字列の内部についてもっと知りたい場合は、いくつかの方法を検討する必要があります。

'dog'.encoding
# => #<Encoding:UTF-8> 
'dog'.bytes.to_a
# => [100, 111, 103] 
'dog'.chars.to_a
# => ["d", "o", "g"]

7ビット以外のASCII文字列と比較します。

'døg'.encoding
# => #<Encoding:UTF-8> 
'døg'.bytes.to_a
# => [100, 195, 184, 103]
'døg'.chars.to_a
# => ["d", "ø", "g"]
于 2012-04-25T14:32:34.887 に答える