sql >> Database >  >> NoSQL >> Redis

Unicode inkapselen van redis

Ik weet niet zeker of er een probleem is.

Als u alle .encode('utf8') . verwijdert uw code aanroept, produceert het een correct bestand, d.w.z. het bestand is hetzelfde als het bestand dat door uw huidige code wordt geproduceerd.

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

Dit toont aan dat sleutels en waarden UTF8-gecodeerd zijn, daarom .encode('utf8') is niet nodig. De standaardcodering voor de redis module is UTF8. Dit kan worden gewijzigd door een codering door te geven bij het maken van de client, b.v. redis.Redis('localhost', encoding='iso-8859-1') , maar daar is geen reden voor.

Als u responsdecodering inschakelt met decode_responses=True dan worden de antwoorden geconverteerd naar unicode met behulp van de codering van de clientverbinding. Dit betekent alleen dat u de geretourneerde gegevens niet expliciet hoeft te decoderen, redis zal het voor je doen en je een unicode-string teruggeven:

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

Dus, in uw tweede voorbeeld, waar u gegevens die zijn opgehaald uit redis naar een bestand schrijft, moet u, als u responsdecodering inschakelt, het uitvoerbestand openen met de gewenste codering. Als dit de standaardcodering is, kunt u gewoon open() . gebruiken . Anders kunt u codecs.open() . gebruiken of codeer de gegevens handmatig voordat u naar het bestand schrijft.

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. Is het veilig om het journaalbestand van mongodb te verwijderen?

  2. MongooseError - Bewerking `users.findOne()` buffering time-out na 10000ms

  3. Hoe u het beste een RESTful API kunt maken in Node.js

  4. node.js mongodb selecteer document door _id node-mongodb-native