0

アポストロフィを含むRuby文字列で.reverseを呼び出そうとすると、アポストロフィが。に変更され\231\200?ます。s’tIしたがって、逆の呼び出しを含む間違った順序の文字列では、It\231\200?sではなく、になりIt'sます。何か案は?

これはマルチバイトの安全性に関係していると思いますか?回避策はありますか?

4

3 に答える 3

4

これは、Unicodeを正しく処理するruby1.9で正常に機能します。

>> "s’tI".reverse
=> "It’s"

ruby 1.8では、ユニコード文字列を同じようにサポートしておらず、これらのアポストロフィは1バイト以外のASCII文字であるため、マルチバイトのユニコード文字です(たとえば、UTF-8としてエンコードされている場合)。

于 2012-06-10T09:30:27.253 に答える
0

他の人がutf-8を扱っていると説明しているように、一部の文字は複数のバイトで表されます。文字の組み合わせ、サロゲートペアなどもあります。ruby1.8のバイトごとの反転は、これらすべてを無視するため、混乱します。

Ruby 1.9は文字列エンコーディングを理解しますが、ruby 1.8に固執している場合、railsにはutf8を処理するための独自のシステムがあります-文字列を呼び出しmb_charsて、文字列のように見え、文字列のように動作しますが、実装するものを取り戻すことができますのようなメソッドはreversedowncaseユニコードに精通した方法で。たとえば、あなたはすることができます

reversed_string = string.mb_chars.reverse
于 2012-06-10T20:05:02.410 に答える
0

問題は、文字列が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"
于 2012-06-10T09:31:32.210 に答える