mintty 终端、python、curses 和 utf8:显示不正确
我在这里问过,但我觉得可能得不到答案。
- 复制并粘贴这段Python代码:
- 执行它
- 在普通的utf8终端下,它能正常工作,显示“Coordonnées”,但在我家用的mintty终端里却显示“CoordonnM-CM-)es”。有没有什么办法可以让它正常工作,或者我应该去哪里找解决办法(mintty没有字符编码的选项)?
代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, time, random, copy, pprint
import termios, tty, fcntl
import thread, curses
import locale
def curses_main(stdscr, code):
curses.curs_set(0)
stdscr.addstr(2, 0, "Coordonnées")
stdscr.refresh()
# (1) = délai d'attente de 1/10 ème de seconde :
curses.halfdelay(1)
while True:
try:
c=stdscr.getch()
except:
c=-1
if 0<c<256:
if chr(c) in 'Qq':
break
def main():
locale.setlocale(locale.LC_ALL, '')
code = locale.getpreferredencoding()
curses.wrapper(curses_main, code)
if __name__ == '__main__':
main()
更新
错误:我以为找到了问题: 到处都写着要先用这段代码:
locale.setlocale(locale.LC_ALL, '')
所以我试了这个,结果成功了:
locale.setlocale(locale.LC_ALL, 'fr_FR')
=> 强制使用法语
... 这有效,但只对重音符号有效。 如果我尝试打印线条绘制字符:
stdscr.addstr(20,20, "─ │ ┌ ┘ ┐ └ ├ ┤ ┬ ┴ ┼ ═ ║ ╔ ╝ ╗ ╚ ╠ ╣ ╦ ╩ ╬")
给我的结果是:
M-b~T~@ M-b~T~B M-b~T~L M-b~T~X M-...
让我感到困惑的是,vim能正常显示这些字符。所以看起来问题出在... Python上? 在我的Windows/cygwin/mintty环境下是可以工作的:
env | grep -i lang
LANG=C.UTF-8
如果我在家里的Windows/cygwin/mintty里强制设置编码,这就不行:
locale.setlocale(locale.LC_ALL, 'C.UTF-8')
这不行。
有没有什么建议我可以尝试的?Python似乎正确覆盖了区域设置... 控制台配置也没问题,字体可以显示线条绘制字符,因为我在vim里能看到它们。所以再想想,可能是Python的问题,也可能是curses的问题...
2 个回答
0
你的地区设置的编码和你的终端(tty)的编码不一定要相同。
你可以查看一下 sys.stdin.encoding 和 sys.stdout.encoding 的值,然后尝试使用这些编码。
我猜测,mintty 的默认编码是 UTF8,但由于你使用的是 Windows,地区设置的默认编码可能是 cp1252。
0
问题解决了。我的做法是:我重新安装了cygwin,然后在工作中重新打包了我的Python程序,接着重新下载了一遍,然后又安装了minTTY 0.9.5.1(mintty-0.9.5-cygwin17.zip),现在一切正常了。真是奇怪。