использование символов Юникода с wxPython

У меня проблема с wxpython и его элементом управления форматированным текстом, когда я пытаюсь вставить символы Unicode ... \ xb2 печатает вершину '2', '\ u2074' должен печатать вершину '4' ...
редактировать: Я использую windows vista ... и я пробовал 'coding cp1252' и 'utf-8', но с тем же результатом ...
2edit: на vista он вылетает, на xp он показывает странный квадрат (я думаю, это когда преклир не узнает персонажа ...)

вот исходный код:

from __future__ import unicode_literals

import wx
import wx.richtext as rt

class Trial(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Prova', 
                size=(400, 400))

        self.rtc = rt.RichTextCtrl(self, style=wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER)
        wx.CallAfter(self.rtc.SetFocus)
        #self.rtc.Freeze()
        self.rtc.BeginFontSize(14)
        self.rtc.WriteText('hei!\xb2') #alright
        self.rtc.WriteText('hi\u2074!')#crash
        self.rtc.EndFontSize()
        
       
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Trial()
    frame.Show()
    app.MainLoop()

но когда я пытаюсь запустить его, он вылетает ...

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    frame = display.Trial()
  File "C:\Users\expert\Desktop\display.py", line 15, in __init__
    self.rtc.WriteText('hi\u2074!')
  File "C:\Python26\lib\site-packages\wx-2.8-msw-ansi\wx\richtext.py", line 2507, in WriteText
    return _richtext.RichTextCtrl_WriteText(*args, **kwargs)
  File "C:\Python26\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2074' in position 4: character maps to <undefined>

И что я должен делать? Мне действительно нужно это показать ...

Спасибо всем!!


person Ant    schedule 03.10.2010    source источник


Ответы (2)


Если вам нужна поддержка Unicode, вам следует использовать версию wxpython для Unicode.

Существует две версии wxPython для каждой из поддерживаемых версий Python в Win32. Они почти идентичны, за исключением того, что один из них был скомпилирован с поддержкой Unicode-версии API платформы. Если вам не сказали иначе, вы, вероятно, захотите получить Unicode-сборку wxPython.

У большинства других платформ также есть две версии.

Он отлично работает, если вы передаете фактические символы, например

self.rtc.WriteText("hei!²")
person volting    schedule 03.10.2010
comment
ничего ... я переустановил wxpython 2.6 (версия Unicode), но он дает точно такой же результат ... (у меня уже была эта версия, но я не помню ...) - person Ant; 03.10.2010
comment
Я только что проверил ваше право ... Я не уверен, почему это так, но он отлично работает, если использовать фактические символы вместо представления utf, то есть self.rtc.WriteText("hei!²") работает. - person volting; 03.10.2010
comment
@ant: путь установки содержит wx-2.8-msw-ansi, поэтому я уверен, что у вас не была версия Unicode. Убедитесь, что вы полностью удалили пакет wxPython и переустановили сборку Unicode. Дополнительная информация на wiki.wxpython.org/UnicodeBuild - person AndiDog; 03.10.2010
comment
На самом деле '\xb2' работает, но '\u2074' отображается как квадрат. - person volting; 03.10.2010
comment
Он отображается как квадрат, потому что ваш шрифт не содержит этого глифа. U + 2074 - это верхний индекс 4 и не содержится во многих шрифтах, тогда как ² есть в большинстве шрифтов. Попробуйте использовать другой символ, отличный от Windows-1252, например U + 04B0 (должен работать с Tahoma). - person AndiDog; 03.10.2010
comment
@andi, но я установил версию Unicode ... отсюда sourceforge.net/projects/wxpython/files/wxPython/2.8.11.0/, а также я проверил, что установка станет стандартной ... действительно, unicode в wx.PlatformInfo возвращает True - person Ant; 03.10.2010
comment
@volting да, мне нравится ... @andi извини, я не уверен, что понял, что ты написал ... - person Ant; 03.10.2010
comment
@ant: Итак, теперь, когда вы установили версию Unicode и получили то же поведение, что и volting (квадрат вместо символа), ваша проблема решена. Выберите системный шрифт, например DejaVu Sans, который поддерживает надстрочный четырехзначный символ, чтобы увидеть символ. - person AndiDog; 03.10.2010
comment
@AndiDog: +1 Я даже не думал о поддержке шрифтов, мне придется вспомнить об этом в следующий раз, когда у меня возникнут проблемы с юникодом. - person volting; 03.10.2010
comment
я не могу сделать +1, потому что у меня недостаточно репутации ... извините - person Ant; 03.10.2010

Иногда это может произойти, если вы забыли установить кодировку. Поместите это в начало кода:

# -*- encoding: utf-8 -*-

перед любым кодом, включая комментарии, но после shebang (#! / usr / bin / python)

person Thomas O    schedule 03.10.2010
comment
Неправильно, если забыть строку кодировки, вместо UnicodeEncodeError будет SyntaxError. - person AndiDog; 03.10.2010