mintty 终端、python、curses 和 utf8:显示不正确

4 投票
2 回答
2586 浏览
提问于 2025-04-16 10:30

我在这里问过,但我觉得可能得不到答案。

  • 复制并粘贴这段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),现在一切正常了。真是奇怪。

撰写回答