Arhn - архитектура программирования

Проблема с кодировкой при печати символа степени в текстовом документе с использованием docx

Попытка добавить символ степени в текстовый документ с использованием docx python, и моя функция определяется следующим образом:

def convert_decimal_degrees2DMS(self,value):
    #value = math.fabs(value)
    degrees = int(value)
    submin = math.fabs( (value - int(value) ) * 60)
    minutes = int(submin)
    subseconds = round(math.fabs((submin-int(submin)) * 60),1)
    subseconds = int(subseconds)
    self.angle = str(degrees) + " Degrees " + str(minutes) + " Minutes " +\
               str(subseconds)[0:2] + " Seconds "
    #self.angle = str(degrees) + "-" + str(minutes) + "-" + str(subseconds)
    #return str(degrees) + "-" + str(minutes) + "-" + str(subseconds)
    #degree = u'\N{DEGREE SIGN}'.encode('utf-8')
    return "{0}{1}{2}'{3}''".format(degrees,u'°'.encode('cp1252'),minutes,subseconds)

и ошибка, которую я продолжаю получать, такова:

  File "lxml.etree.pyx", line 921, in lxml.etree._Element.text.__set__ (src\lxml\lxml.etree.c:41467)
  File "apihelpers.pxi", line 652, in lxml.etree._setNodeText (src\lxml\lxml.etree.c:18888)
  File "apihelpers.pxi", line 1335, in lxml.etree._utf8 (src\lxml\lxml.etree.c:24701)
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
Exception AttributeError: "'NoneType' object has no attribute 'print_exc'" in <function _remove at 0x01E0F770> ignored

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


  • Функция возвращает то, что я добавляю в текстовый документ. 07.08.2013

Ответы:


1

u'°'.encode('cp1252') возвращает строку байтов (типа str), эквивалентную '\xb0'. Точно так же в других местах вы конвертируете вещи в str. Ошибка говорит вам, что вам нужны строки типа unicode (кодовые точки Unicode) вместо str (байты). Сам знак градуса, скорее всего, не проблема.

Решение состоит в том, чтобы вместо этого просто предоставить строки Unicode: поэтому u'°' вместо u'°'.encode('cp1252') и

self.angle = degrees + u" Degrees " + minutes + u" Minutes " + \
               subseconds[0:2] + u" Seconds "

вместо

self.angle = str(degrees) + " Degrees " + str(minutes) + " Minutes " +\
               str(subseconds)[0:2] + " Seconds "

(при условии, что degrees и т. д. имеют тип unicode вместо str). Обратите внимание на синтаксис u'' для строк Unicode, а не на синтаксис '' для строк байтов.

Единственное, что вы должны помнить о включении символов, отличных от ASCII, в исходный код Python, — это заголовок кодировки, описанный в PEP-0263. Таким образом, вы должны следовать шебангу с объявлением кодировки:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

Просто имейте в виду, что использование PEP 0263 волшебным образом не устраняет двойственность str и unicode. '°' будет любым str (строка байтов), найденным в файле исходного кода на диске и, следовательно, не обязательно длиной 1 (если ISO-8859-1, это эквивалентно '\xb0', если DOS cp437, то '\xf8', если UTF-8 , до '\xc2\xb0'). Принимая во внимание, что u'°' будет кодовой точкой Unicode U+00B0 независимо от кодировки исходного кода.

Вот иллюстрация символов, отличных от ASCII, в исходном коде. Для этого примера важно видеть фактические байты исходного кода. Исходный код имеет кодировку UTF-8, поэтому '°' имеет длину 2; это ведь байтовая строка.

$ cat x.py 
#!/usr/bin/python
# -*- coding: UTF-8 -*-

print repr('°')
print len('°')
print len(u'°')

$ od -c -txC x.py
0000000    #   !   /   u   s   r   /   b   i   n   /   p   y   t   h   o
           23  21  2f  75  73  72  2f  62  69  6e  2f  70  79  74  68  6f
0000020    n  \n   #       -   *   -       c   o   d   i   n   g   :    
           6e  0a  23  20  2d  2a  2d  20  63  6f  64  69  6e  67  3a  20
0000040    U   T   F   -   8       -   *   -  \n  \n   p   r   i   n   t
           55  54  46  2d  38  20  2d  2a  2d  0a  0a  70  72  69  6e  74
0000060        r   e   p   r   (   '   °  **   '   )  \n   p   r   i   n
           20  72  65  70  72  28  27  c2  b0  27  29  0a  70  72  69  6e
0000100    t       l   e   n   (   '   °  **   '   )  \n   p   r   i   n
           74  20  6c  65  6e  28  27  c2  b0  27  29  0a  70  72  69  6e
0000120    t       l   e   n   (   u   '   °  **   '   )  \n            
           74  20  6c  65  6e  28  75  27  c2  b0  27  29  0a
$ python x.py
'\xc2\xb0'
2
1
06.08.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..