6

Ruby 1.8.7 で実行されている Web サイトがあります。最大 12000 文字を許可することを確認する受信投稿の検証があります。投稿が検証される前に、スペースは文字としてカウントされ、タブと改行は取り除かれます。

検証対象の投稿はこちらhttp://pastie.org/5047582

Ruby 1.9 では、文字列の長さは 11909 と表示されますが、これは正しいです。しかし、Ruby 1.8.7 で長さを確認すると、12044 であることがわかりました。

私は codepad.org を使用してhttp://codepad.org/OxgSuKGZ (長さを 12044 として出力しますが、これは間違っています) を与えるこのルビー コードを実行しましたが、codeacademy.org のコンソールでこの同じコードを実行すると、文字列の長さは 11909 です。

なぜこれが起こっているのか誰か説明できますか???

ありがとう

4

1 に答える 1

11

これはユニコードの問題です。使用している文字列には ASCII 範囲外の文字が含まれており、頻繁に使用される UTF-8 エンコーディングはそれらを 2 (またはそれ以上) バイトとしてエンコードします。

Ruby 1.8 は Unicode を適切に処理せず、単に文字列のバイトlength数を与えるだけで、次のような面白い結果が得られました。

"ą".length
=> 2

Ruby 1.9 では Unicode の処理が改善されています。これには、Ruby がエンコーディングを認識している限り、文字列内の実際の文字数lengthを返すことが含まれます。

"ä".length
=> 1

Ruby 1.8 で考えられる回避策の 1 つは、Unicode を認識できる正規表現を使用することです。

"ą".scan(/./mu).size
=> 1
于 2012-10-12T21:19:10.347 に答える