Невозможно декодировать список байтов в список строк - PullRequest
0 голосов
/ 10 октября 2019

В моей пользовательской переменной я храню список байтов, который я получаю из локального ldap, и преобразую в список строк с помощью цикла for. Я должен вернуть этот список как jsonify. Если я не использую этот ключ кодирования, я получаю другой вывод от оригинала, но все еще закодирован. Проблема в том, что я нигде не могу получить доступ к методу декодирования. Любая помощь?

users = ldap.get_group_members('ship_crew')

 user_list = []
 for user in users:
     user_list.append((str(user, encoding='utf-8').split(",")[0].split("=")[1]))
 return jsonify(user_list)

исходный список от переменной пользователя:

[
  "cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com", 
  "cn=Turanga Leela,ou=people,dc=planetexpress,dc=com", 
  "cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"
]

для цикла с закодированным выводом:

[
  "Philip J. Fry", 
  "Turanga Leela", 
  "Bender Bending Rodr\u00edguez"
]

ожидается:

[
  "Philip J. Fry", 
  "Turanga Leela", 
  "Bender Bending Rodríguez"
]

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Ваш вывод правильный JSON. Кодовая точка Unicode 00ED - это í, и в JSON любой символ может быть экранирован с использованием его кодовой точки Unicode. «\ 00ed», как в вашем выводе JSON, является допустимым способом записи этого символа.

Было бы также правильно, чтобы JSON имел этот символ без его кодирования, но, очевидно, jsonify решит его кодировать.

Любой компетентный JSON-декодер затем превратит его обратно в.

Если вы используете стандартную библиотеку json.dumps, вы можете использовать ensure_ascii=False, чтобы предотвратить это, если вы этого не хотите, но я нене знаю, что такое "jsonify".

0 голосов
/ 10 октября 2019

Я бы использовал регулярное выражение для извлечения ваших имен:

import re
l = [
  "cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com", 
  "cn=Turanga Leela,ou=people,dc=planetexpress,dc=com", 
  "cn=Bender Bending Rodr\u00edguez,ou=people,dc=planetexpress,dc=com"
]

NAME_PATTERN = re.compile(r'cn=(.*?),')
result = [NAME_PATTERN.match(s).group(1) for s in l]
print(result)

Вывод:

['Philip J. Fry', 'Turanga Leela', 'Bender Bending Rodríguez']

Обратите внимание, что при выгрузке его в JSON í не поддерживается, так какпо умолчанию он пытается преобразовать в ASCII, поэтому он выводит его в UTF-16 (Unicode 0x00ED):

import json
print(json.dumps(result, indent=2))

Выход:

[
  "Philip J. Fry",
  "Turanga Leela",
  "Bender Bending Rodr\u00edguez"
]

Вы можете обойти это, установив ensure_ascii=False если хотите, хотя, если вы используете это в API, я был бы осторожен и придерживался ASCII с кодировкой Unicode:

print(json.dumps(result, indent=2, ensure_ascii=False))

Вывод:

[
  "Philip J. Fry",
  "Turanga Leela",
  "Bender Bending Rodríguez"
]
...