0

我在使用 python3 诅咒和 unicode 时遇到问题:

#!/usr/bin/env python3
import curses
import locale

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

def doStuff(stdscr):
  offset = 3
  stdscr.addstr(0, 0, "わたし")
  stdscr.addstr(0, offset, 'hello', curses.A_BOLD)
  stdscr.getch() # pauses until a key's hit

curses.wrapper(doStuff)

我可以很好地显示 unicode 字符,但是 addstr 的 y-offset 参数(我的代码中的“偏移量”)没有按预期运行;我的屏幕显示“わたhello”而不是“わたしhello”

事实上,偏移量有非常奇怪的行为:

- 0:hello
- 1:わhello
- 2:わhello
- 3:わたhello
- 4:わたhello
- 5:わたしhello
- 6:わたしhello
- 7:わたし hello
- 8:わたし  hello
- 9:わたし   hello

请注意,偏移量不是字节,因为字符是 3 字节的 unicode 字符:

>>>len("わ".encode('utf-8'))
3
>>> len("わ")
1

我正在运行 python 4.8.3,curses.version 是“b'2.2'”。

有谁知道发生了什么或如何调试它?提前致谢。

4

2 回答 2

0

您正在打印 3 个双角字符。也就是说,每个都占用两个单元格。

以字符(或字节)为单位的字符串长度不一定与每个字符使用的单元格数相同。

Python curses 只是 ncurses 上的一个薄层。

我希望通过将一个字符放在那些双角字符的第二个单元格上来删除第 1、3、5 行中的字符(ncurses 应该这样做......),但这个细节可能是一个错误终端仿真器)。

于 2016-12-15T02:38:39.263 回答
0

根据 Thomas 的回复,我找到了 wcwidth 包 ( https://pypi.python.org/pypi/wcwidth ),它具有返回单元格中 unicode 字符串长度的功能。

这是一个完整的工作示例:

#!/usr/bin/env python3
import curses
import locale
from wcwidth import wcswidth

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

def doStuff(stdscr):
  foo = "わたし"
  offset = wcswidth(foo)
  stdscr.addstr(0, 0, foo)
  stdscr.addstr(0, offset, 'hello', curses.A_BOLD)
  stdscr.getch() # pauses until a key's hit

curses.wrapper(doStuff)
于 2016-12-15T17:04:14.800 回答