sql >> Databasteknik >  >> NoSQL >> Redis

Inkapslar Unicode från redis

Jag är inte säker på att det finns ett problem.

Om du tar bort alla .encode('utf8') anropar din kod producerar den en korrekt fil, dvs filen är densamma som den som skapas av din nuvarande kod.

>>> 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'])

Detta visar att nycklar och värden är UTF8-kodade, därför .encode('utf8') behövs inte. Standardkodningen för redis modulen är UTF8. Detta kan ändras genom att skicka en kodning när klienten skapas, t.ex. redis.Redis('localhost', encoding='iso-8859-1') , men det finns ingen anledning till det.

Om du aktiverar svarsavkodning med decode_responses=True sedan kommer svaren att konverteras till unicode med hjälp av klientanslutningens kodning. Detta betyder bara att du inte behöver explicit avkoda den returnerade datan, redis kommer att göra det åt dig och ge dig tillbaka en unicode-sträng:

>>> 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'])

Så, i ditt andra exempel där du skriver data hämtad från redis till en fil, om du aktiverar svarsavkodning måste du öppna utdatafilen med önskad kodning. Om detta är standardkodningen kan du bara använda open() . Annars kan du använda codecs.open() eller koda data manuellt innan du skriver till filen.

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. Mongoose &unikt fält

  2. Hur kan jag skapa ett index med pymongo

  3. mongodb/mongoose findMany - hitta alla dokument med ID:n listade i array

  4. MySQL-export till MongoDB