복붙노트

[REDIS] 레디 스에서 유니 코드를 저장하지만, 가져 오기 오류

REDIS

레디 스에서 유니 코드를 저장하지만, 가져 오기 오류

내가 MongoDB를하고 레디 스를 사용하고, 레디 스 내 캐시입니다.

나는 레디 스-PY와 MongoDB의 객체를 캐싱하고 있습니다 :

obj in mongodb: {u'name': u'match', u'section_title': u'\u6d3b\u52a8', u'title': 
u'\u6bd4\u8d5b', u'section_id': 1, u'_id': ObjectId('4fb1ed859b10ed2041000001'), u'id': 1}

하여 obj는 hgetall (키 OBJ)는 함께 레디 스로부터 꺼낼 :

{'name': 'match', 'title': '\xe6\xaf\x94\xe8\xb5\x9b', 'section_title': 
'\xe6\xb4\xbb\xe5\x8a\xa8', 'section_id': '1', '_id': '4fb1ed859b10ed2041000001', 'id': '1'}

당신이 볼 수 있듯이, OBJ 캐시에서 가져온 것은 그래서 내 응용 프로그램에 오류들처럼이, str을 대신 유니 코드입니다 : '아스키'코덱 수 없습니다 디코드 바이트 0xe6 위치 12 : 서수없는 범위 내에서 (128)

사람이 몇 가지 제안을 줄 수 있습니까? 고마워

해결법

  1. ==============================

    1.업데이트, 전역 설정, 체크 jmoz의 답변.

    업데이트, 전역 설정, 체크 jmoz의 답변.

    당신이 lib에는 타사를 사용하는 경우와 같은 장고 - 레디 스, 당신은 사용자 정의 ConnectionFactory에를 지정해야 할 수도 있습니다 :

    class DecodeConnectionFactory(redis_cache.pool.ConnectionFactory):
        def get_connection(self, params):
            params['decode_responses'] = True
            return super(DecodeConnectionFactory, self).get_connection(self, params)
    

    당신은 레디 스-PY를 사용하는 가정하면, 당신은 더 나은 레디 스에 유니 코드 대신 str을 전달하는 것, 또는 다른 레디 스 일반적으로 UTF-8, * 설정 명령에 대해 자동으로 인코딩됩니다. * 표시하는 get 명령의 경우, 레디 스는 값의 형식 유형에 대한 아무 생각이없고 단지 직접 STR의 값을 반환한다.

    데니스 말했듯 따라서, 당신은 레디 스에 객체를 저장하는 방식은 매우 중요하다. 당신은 당신을위한 레디 스 층이 투명하게 STR에 값을 변환해야합니다.

    또한, UTF-8 인코딩 대신 ASCII를 사용하여 기본 설정

  2. ==============================

    2.내가 문제를 발견했습니다 생각합니다. 이것을 읽은 후, 명시 적으로 고통 레디 스하지만, 작품에서 디코딩했다.

    내가 문제를 발견했습니다 생각합니다. 이것을 읽은 후, 명시 적으로 고통 레디 스하지만, 작품에서 디코딩했다.

    나는 저자의 출력은 광산 다른 OBV했다 모든 유니 코드 문자열했다 블로그 포스트를 우연히 발견했다.

    기본적으로 False입니다 매개 변수 decode_responses이 init__ StrictRedis .__으로 찾고있다. https://github.com/andymccurdy/redis-py/blob/273a47e299a499ed0053b8b90966dc2124504983/redis/client.py#L446

    이 해결합니다 OP 'S 이슈 구조에 나를 위해 진정한 = decode_responses에 전달합니다.

  3. ==============================

    3.각각의 문자열을 사용하면, 예를 들어, UTF-8로 변환하는 디코드 기능을 사용할 수 있습니다 값에 대한 경우 코드에서 제목 필드 :

    각각의 문자열을 사용하면, 예를 들어, UTF-8로 변환하는 디코드 기능을 사용할 수 있습니다 값에 대한 경우 코드에서 제목 필드 :

    In [7]: a='\xe6\xaf\x94\xe8\xb5\x9b'
    
    In [8]: a.decode('utf8')
    Out[8]: u'\u6bd4\u8d5b'
    
  4. ==============================

    4.나는 MongoDB를 나 레디 스 (또는 외부 시스템)에 기록하기 전에 항상 UTF-8 인코딩을 당신을 제안한다. 그리고 당신은 디코딩 것으로 ( 'UTF-8') 당신이 결과를 fecth, 그래서 파이썬에서 유니 코드를 사용하면 항상 작동하는지.

    나는 MongoDB를 나 레디 스 (또는 외부 시스템)에 기록하기 전에 항상 UTF-8 인코딩을 당신을 제안한다. 그리고 당신은 디코딩 것으로 ( 'UTF-8') 당신이 결과를 fecth, 그래서 파이썬에서 유니 코드를 사용하면 항상 작동하는지.

  5. from https://stackoverflow.com/questions/10599147/save-unicode-in-redis-but-fetch-error by cc-by-sa and MIT license