sql >> Databáze >  >> NoSQL >> Redis

Zapouzdření Unicode od redis

Nejsem si jistý, zda došlo k problému.

Pokud odstraníte všechny .encode('utf8') zavolá váš kód, vytvoří správný soubor, tj. soubor je stejný jako soubor vytvořený vaším aktuálním kódem.

>>> r_server = redis.Redis('localhost')
>>> r_server.keys()
[]
>>> r_server.sadd(u'Hauptstädte', u'東京', u'Godthåb',u'Москва')
3
>>> r_server.keys()
['Hauptst\xc3\xa4dte']
>>> r_server.smembers(u'Hauptstädte')
set(['Godth\xc3\xa5b', '\xd0\x9c\xd0\xbe\xd1\x81\xd0\xba\xd0\xb2\xd0\xb0', '\xe6\x9d\xb1\xe4\xba\xac'])

To ukazuje, že klíče a hodnoty jsou kódovány UTF8, proto .encode('utf8') není nutné. Výchozí kódování pro redis modul je UTF8. To lze změnit předáním kódování při vytváření klienta, např. redis.Redis('localhost', encoding='iso-8859-1') , ale není k tomu žádný důvod.

Pokud povolíte dekódování odpovědí pomocí decode_responses=True poté budou odpovědi převedeny na unicode pomocí kódování klientského připojení. To jen znamená, že nemusíte explicitně dekódovat vrácená data, redis udělá to za vás a vrátí vám řetězec unicode:

>>> r_server = redis.Redis('localhost', decode_responses=True)
>>> r_server.keys()
[u'Hauptst\xe4dte']
>>> r_server.smembers(u'Hauptstädte')
set([u'Godth\xe5b', u'\u041c\u043e\u0441\u043a\u0432\u0430', u'\u6771\u4eac'])

Takže ve vašem druhém příkladu, kde zapisujete data získaná z redis do souboru, pokud povolíte dekódování odpovědi, musíte otevřít výstupní soubor s požadovaným kódováním. Pokud je toto výchozí kódování, stačí použít open() . Jinak můžete použít codecs.open() nebo ručně zakódujte data před zápisem do souboru.

import codecs

cities_tag = u'Hauptstädte'
with codecs.open('capitals.txt', 'w', encoding='utf8') as f:
    while r_server.scard(cities_tag) != 0:
        city = r_server.srandmember(cities_tag)
        f.write(city + '\n')
        r_server.srem(cities_tag, city)



  1. Regex pro MongoDB ObjectID

  2. MongoDB vs MySQL

  3. Apache Phoenix pro CDH

  4. $unwind prázdné pole