アポストロフィを含むRuby文字列で.reverseを呼び出そうとすると、アポストロフィが。に変更され\231\200?
ます。s’tI
したがって、逆の呼び出しを含む間違った順序の文字列では、It\231\200?s
ではなく、になりIt's
ます。何か案は?
これはマルチバイトの安全性に関係していると思いますか?回避策はありますか?
アポストロフィを含むRuby文字列で.reverseを呼び出そうとすると、アポストロフィが。に変更され\231\200?
ます。s’tI
したがって、逆の呼び出しを含む間違った順序の文字列では、It\231\200?s
ではなく、になりIt's
ます。何か案は?
これはマルチバイトの安全性に関係していると思いますか?回避策はありますか?
これは、Unicodeを正しく処理するruby1.9で正常に機能します。
>> "s’tI".reverse
=> "It’s"
ruby 1.8では、ユニコード文字列を同じようにサポートしておらず、これらのアポストロフィは1バイト以外のASCII文字であるため、マルチバイトのユニコード文字です(たとえば、UTF-8としてエンコードされている場合)。
他の人がutf-8を扱っていると説明しているように、一部の文字は複数のバイトで表されます。文字の組み合わせ、サロゲートペアなどもあります。ruby1.8のバイトごとの反転は、これらすべてを無視するため、混乱します。
Ruby 1.9は文字列エンコーディングを理解しますが、ruby 1.8に固執している場合、railsにはutf8を処理するための独自のシステムがあります-文字列を呼び出しmb_chars
て、文字列のように見え、文字列のように動作しますが、実装するものを取り戻すことができますのようなメソッドはreverse
、downcase
ユニコードに精通した方法で。たとえば、あなたはすることができます
reversed_string = string.mb_chars.reverse
問題は、文字列がUnicode文字ではなく2進文字を使用していることです。事前にバイナリ文字列をUnicode文字列にデコードする必要があります。
irb(main):001:0> "a\u9F9Cb".reverse
=> "b\u9F9Ca"
irb(main):002:0> "a\xE9\xBE\x9Cb".reverse
=> "a\x9C\xBE\xE9b"
irb(main):003:0> "a\xE9\xBE\x9Cb".force_encoding('UTF-8').reverse
=> "b\u9F9Ca"