2016-11-04 3 views
1

Мне интересно, как получить представление Unicode арабских строк, например سلام в Python?Как получить представление Unicode арабских строк в Django?

Результат должен быть \u0633\u0644\u0627\u0645

мне нужно, что так, что я могу сравнить тексты, извлеченные из БД MySQL и данные, хранящиеся в кэше Redis.

ответ

2

Если у вас есть фактические строки Unicode, вы можете сделать

# -*- coding: utf-8 -*- 
s = u'سلام' 
print s.encode('unicode-escape')  

выход

\u0633\u0644\u0627\u0645 

директива # -*- coding: utf-8 -*- чисто сказать переводчику, что исходный код UTF-8 кодируются, он не имеет никакого отношения, как сам скрипт обрабатывает Unicode.


Если ваш скрипт читает эту арабскую строку из UTF-8 кодируемого источника, байт будет выглядеть следующим образом:

\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85 

Вы можете конвертировать, что в Unicode, как это:

data = '\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85' 
s = data.decode('utf8') 
print s 
print s.encode('unicode-escape') 

выход

سلام 
\u0633\u0644\u0627\u0645 

Конечно, вам нужно убедиться, что ваш терминал настроен правильно обрабатывать Unicode.

Обратите внимание, что

'\u0633\u0644\u0627\u0645' 

представляет собой обычный (байт) строка, содержащая 24 байта, в то время как

u'\u0633\u0644\u0627\u0645' 

является строкой Unicode, содержащий 4-х символов Unicode.

Вы можете найти эту статью полезной: Pragmatic Unicode, которая была написана ветеранкой СО Ned Batchelder.

+0

Ну, пока это работает в терминале, мне нужно назначить вывод новой переменной. Это невозможно сделать с помощью 'print' в my views.py. Любые идеи, чтобы исправить это? – supermario

+1

@supermario Что-то вроде этого должно работать: 'a = s.encode ('unicode-escape')' –

0

Подготовьте строку с помощью u в python 2.x, что делает вашу строку строкой unicode. Затем вы можете вызвать метод unicode encode.

arabic_string = u'سلام' 
arabic_string.encode('utf-8') 

Выход:

print arabic_string.encode('utf-8') 
'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85' 
+0

Это yeilds ошибка: '«ASCII»кодек не может кодировать символы в позиции 0-3: порядковый не в диапазоне (128)' – supermario

+0

Какой Python версии вы используете? – JClarke

+0

Я использую Python 2.7.6 – supermario

0

Для питона 2,7

string = 'سلام' 
new_string = unicode(string) 
+0

Когда я печатаю 'string' в терминале, он по-прежнему' سلام'. Кроме того, сравнение не происходит, как ожидалось. – supermario

+0

Извините, просто назначьте его – Navidad20

0

Поскольку вы используете Python 2.x, вы не сможете использовать encode. Вам нужно будет использовать функцию unicode, чтобы передать строку в объект unicode.

> f='سلام' 
> f 
'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85' 
> unicode(f, 'utf-8') # note: you need to pass the encoding parameter in or you'll 
         # keep having the same problem. 
u'\u0633\u0644\u0627\u0645' 
> print unicode(f, 'utf-8') 
سلام 

Я не уверен, что библиотека вы используете для извлечения содержимого, но вы можете быть в состоянии извлечь данные, как юникод изначально.

> f = u'سلام' 
> f 
u'\u0633\u0644\u0627\u0645' 
> print f.encode('unicode-escape') 
\u0633\u0644\u0627\u0645 
> print f 
سلام