1

私が構築しているシステムは、負でないRuby整数を可能な限り最短のUTF-8文字列(オクテット文字列である必要があります。以下の編集を参照)の値に変換する必要があります。文字列の唯一の要件は、辞書式順序が整数の自然な順序と同じであることです。

これを行うための最良のRubyの方法は何ですか?

整数は32ビットで、符号ビットは0であると想定できます。これは成功です。

(i >> 24).chr + ((i >> 16) & 0xff).chr + ((i >> 8) & 0xff).chr + (i & 0xff).chr

しかし、それは1)ゴミが多く、2)醜いようです。解決策も検討しましたpackが、バイトオーダーのために移植性がないようです。

FWIW、アプリケーションはRedisハッシュフィールド名です。キーの作成はパフォーマンスのボトルネックになる可能性がありますが、おそらくそうではありません。この質問は主に「ルビーの方法」についてです。

編集

Abpve UFT-8ではなく「可能な限り短いオクテットの文字列」と言うべきでした。これは、Redisが実際にフィールドキー用に保存するものだからです。真のUTF-8パッキングssemを機能させるための@MarkReedの優れた提案。私が使用しているredisgemは、拡張コードをRedisのオクテットシーケンスに適切に変換しているようです。たとえば、

REDIS.hset('hash', [0x12345678].pack('U'), 'foo')

正常に動作します。しかしその後

REDIS.hkeys('hash')

戻り値

"\xFC\x92\x8D\x85\x99\xB8"

これらの文字列の辞書式順序が正しいことを確認する必要がありますが、これまでのところ問題はないようです。

編集を終了

4

2 に答える 2

2

有効なUTF-8である必要がある場合は、コードポイントをUTF-8文字としてエンコードするだけで十分な改善は得られません。UTF-8の機能の1つは、エンコードされた文字が適切な番号順にソートされ、フォーマットの規則の下で必要な最小限のバイト数のみを使用することです。

[i].pack('U')

UTF-8はバイト指向であるため、エンディアンの懸念はありません。

実際にUTF-8を意味していなかった場合は、意味を明確にしてください。

于 2012-11-26T17:09:40.837 に答える
0

任意のベースに変換し、その出力を使用してキャラクターを選択できるようにする必要があります。この回答を参照してくださいhttps://stackoverflow.com/a/2895806/131227

于 2012-11-26T17:02:44.577 に答える