2012-01-22 3 views
4

redis dbでアクセント付きの文字列を設定したり取得したりすることはできません。
アクセント付きチャードはエンコードされていますが、設定したとおりに戻すにはどうすればよいですか?アクセント付きの文字列を保存して取得するには?

redis> set test téléphone 
OK 
redis> get test 
"t\xc3\xa9l\xc3\xa9phone" 

私は、これはすでに(http://stackoverflow.com/questions/6731450/redis-problem-with-accents-utf-8-encoding) を依頼されている知っているが、詳細な答えはありません。

答えて

19

Redisサーバー自体はすべてのデータをバイナリオブジェクトとして格納するため、エンコードには依存しません。サーバーは、クライアントから送信されたもの(UTF-8文字を含む)だけを格納します。ここで

は、いくつかの実験である:

$ echo téléphone | hexdump -C 
00000000 74 c3 a9 6c c3 a9 70 68 6f 6e 65 0a    |t..l..phone.| 

c3a9は 'E' 文字の表現です。

$ redis-cli 
> set t téléphone 
OK 
> get t 
"t\xc3\xa9l\xc3\xa9phone" 

実際、データはRedisサーバーに正しく保存されています。しかし、端末で起動されると、Redisクライアントは出力を解釈し、sdscatrepr functionを適用して、印刷可能でない文字を変換します(その定義はロケールに依存し、マルチバイト文字の場合は破損する可能性があります)。

簡単な回避策は、「生」オプションでのRedisは-CLIを起動することです:

$ redis-cli --raw 
> get t 
téléphone 

それはすべきではないので、おそらく、クライアントライブラリではなく、Redisの-CLIのいずれかを使用しますあなた自身のアプリケーション実際の問題。

+0

ありがとうございます、あなたの説明は事をもっとはっきりさせます。 You'r right私はDBを照会するためにnode-redis(node.jsモジュール)を使用しています。ノードredisが "raw"オプションをどのように使用しているかを確認します。 – Luc

+0

すばらしい説明!ありがとう@Didier! –

関連する問題