我正在为计算程序编写一个Qt接口,我想用单位写一个区域(即LaTex输出m^2
或m2。)
如果我在此代码中使用特殊的²字符:area_label = QtGui.QLabel("m²")
,它将在GUI中显示以下内容:m²
。
我怀疑这可能是一个编码问题,编写我正在寻找的平方指数的方法是什么?
其他问题:有没有办法输出任何指数,任何未定义为特殊字符的人(比如说m^8
)?
其他信息: 我正在使用python 2.7.2,PySide版本1.1.1和Qt 4.7.4。在Windows 7,SP1中工作,但我希望我的代码在可能的情况下是跨平台的。
此外,由于我正在使用Windows并且使用法语口音(例如à
和é
),我在文件的开头使用此编码行:{{1} }。
答案 0 :(得分:3)
您的编码问题似乎是您正在传递UTF-8字符串,PySide / Qt正在尝试根据您的系统编码来解释,这与Latin-1兼容(如cp1252,传统Windows默认为西方)欧洲语言而不是UTF-8。你可以很容易地看到这个:
>>> print u'm\u00b2'.encode('utf-8').decode('latin-1')
m²
PySide可以在任何地方使用unicode
个字符串。所以,如果您只是在unicode
处使用str
而不是bytes
/ def superscript(digit):
if digit in (2, 3):
return unichr(0x00B0 + digit)
else:
return unichr(0x2070 + digit)
,包括在PySide的接口处,那么您应该没问题。
有没有办法输出任何指数,任何一个未定义为特殊字符的指数(比如m ^ 8)?
好吧,⁸(U + 2078) 被定义为一个特殊字符,这可以通过我在这里输入来证明。
但是,您必须编写自己的代码来解析表达式并生成正确的上标字符。
U + 2070到U + 209F的上标和下标块具有您需要的所有字符,除了2和3之外,它们在U + 00B2和U + 00B3处保留在它们的Latin-1兼容位置。 (某些字体会将U + 2072和U + 2073显示为等效字符,但这些字体不正确,所以你不应该依赖它。另外,1显示为U + 2071和U + 00B9,并且有些字体区分你可能想要打印整个列表,看看哪些看起来更适合你。)
将每个数字转换成上标的功能如下所示:
def term(base, exponent):
return base + u''.join(superscript(int(digit)) for digit in exponent)
所以,一个非常简单的包装器将是:
>>> print term('x', '123')
xⁱ²³
现在:
QLabel
但是,如果你想要更灵活的东西,你可能想要生成HTML而不是纯文本。 Qt的最新版本可以直接在def term(base, exponent):
return u'{}<sup>{}</sup>'.format(base, exponent)
中使用HTML。
如果您可以从表达式生成MathML,Latex等,那么有些工具可以从这些格式生成HTML。
但是对于一个非常微不足道的例子:
x<sup>123</sup>
打印出来时,这只显示QLabel
,但当卡在# -*-coding:Latin-1 -*
(或Stack Overflow答案)时,显示为x 123 。
我使用此编码行:
u'm\2074'
。
为什么呢?如果您可以编辑UTF-8中的文本文件,那将使您的生活更轻松。首先,Latin-1没有任何上标的字符,只有1,2和3,这意味着您必须编写u'm⁴'
之类的内容,而不仅仅是写# -*- coding: Latin-1 -*-
此外,使用几乎(但不完全是)emacs格式的编码声明有点误导。使用emacs格式(使用最后的连字符和适当的间距):
# coding=Latin-1
......或不要:
unicode
无论如何,所有的编码行都是告诉Python如何解释你的字符串文字。如果您创建非u
文字(没有decode
前缀),则在某些时候仍然需要{{1}}。并且,如果你不自己做解码,PySide将不得不猜测,它会猜测你的系统编码(这可能是cp1252-对于上标而言足够接近Latin-1,但是不够接近UTF-8 )。
所以,要解决你所有的问题: