Mintty终端、Python、Curses和UTF8:显示不正确

4

我已经在这里询问过了,但我确信我不会得到答案。

  • 复制并粘贴此Python代码:
  • 执行它
  • 在传统的utf8 shell中,它可以正常工作并显示“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上强制编码,那么这是无效的:doesn't

locale.setlocale(locale.LC_ALL, 'C.UTF-8')

这个不起作用。

有任何想法在哪里可以寻找?Python似乎正确地覆盖了本地设置...控制台已经正确配置,并且字体可以显示线条字符,因为我在vim中看到它们。所以仔细思考,可能是Python的问题或curses的问题...


该死!Python代码无法正确显示。如果您知道如何在此处显示它,请访问此链接,将代码复制粘贴到这里(并告诉我如何使其在此处正常工作=)非常感谢) - Olivier Pons
Windows Python 还是 Cygwin Python? - ak2
Cygwin => 通过mintty命令行 => 启动Python脚本 - Olivier Pons
LC_ALL、LC_CTYPE和LANG环境变量设置是什么?在mintty选项的文本页面上,区域设置/字符集设置是什么? - ak2
我最初以为它可以工作,所以我发布了自己的答案...但它只适用于特定的法语字符(如“é”)。线条绘制字符无法正常工作。请查看我的答案,其中我提供了更多问题的详细信息。也许问题并不是来自mintty控制台本身... - Olivier Pons
2个回答

0

您的本地首选编码和tty的编码不必相同。

检查sys.stdin.encoding和sys.stdout.encoding是什么,并尝试使用它们。

猜测默认编码为UTF8,但由于是Windows系统,您的本地首选编码可能是cp1252。


今晚我会尝试,但很奇怪的是,在我的工作电脑上它能运行,但在家里不能运行,因为它们都是同一对:cygwin/mintty(因为它们都在Windows下)。如果你是对的,我会告诉你的。非常感谢!另外,你是如何正确显示我的代码的?点击“代码”按钮没有起作用。 - Olivier Pons
stdscr.addstr(4,4,sys.stdin.encoding) stdscr.addstr(5,4,sys.stdout.encoding) 结果:UTF-8/UTF-8 - Olivier Pons
它不起作用。我一开始以为它能用,所以我发布了自己的答案,但它不能用。请查看我的答案,在那里我提供了更多的问题细节。也许问题并不是来自mintty控制台本身... - Olivier Pons

0

问题已解决。这是我所做的:我重新安装了Cygwin,然后在工作中重新打包了我的Python程序,重新下载并安装了minnty 0.9.5.1(mintty-0.9.5-cygwin17.zip),现在它可以正常工作了。很奇怪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接