如何修复prettytable以正确显示中文字符

8
from prettytable import PrettyTable

header="乘客姓名,性别,出生日期".split(",")
x = PrettyTable(header)
x.align["乘客姓名"]="l"
table='''HuangTianhui,男,1948/05/28
姜翠云,女,1952/03/27
李红晶,女,1994/12/09
LuiChing,女,1969/08/02
宋飞飞,男,1982/03/01
唐旭东,男,1983/08/03
YangJiabao,女,1988/08/25
买买提江·阿布拉,男,1979/07/10
安文兰,女,1949/10/20
胡偲婠(婴儿),女,2011/02/25
(有待确定姓名),男,1985/07/20
'''
data=[row for row in table.split("\n") if row]
for row in data:
    x.add_row(row.strip().split(","))

print(x)

enter image description here

我希望输出格式如下。

enter image description here

在这个例子中,prettytable.py不能正确显示中文字符·的模糊宽度,在买买提江·阿布拉中,该字符的宽度不确定。如何修复prettytable.py中的错误?

我在prettytable.py的def _char_block_width(char)函数中添加了两行代码,但问题仍然存在。

if char == 0xb7:
    return 2 

我已经解决了问题,文件prettytable.py应该直接安装在我的电脑d:\python33\Lib\site-packages目录下,而不是以d:\python33\Lib\site-packages\prettytable\prettytable.py的形式存在。

有很多中文字符具有模糊宽度,我们无法添加以下两行代码来解决这个问题,如果有50个模糊字符,将会在prettytable.py中添加100行代码,是否有一种简单的方法来处理所有模糊字符?只需修复一些代码即可处理所有模糊字符吗?

if char == 0xb7:
    return 2 

1
请参考以下链接:https://dev59.com/VFPTa4cB1Zd3GeqPhDA2 - icedtrees
我已经阅读了这篇文章,使用可打印ASCII字符的全宽版本并不是一个好主意。我发现在R中没有这样的问题,可以显示各种字符。Python需要向R学习以创建良好的显示效果。现在,我想知道R是如何做到的? - showkey
1个回答

5
你遇到的问题与Python输出中错误填充行中的点字符有关。这个点是Unicode码点U+00B7·中间点。这个字符被认为具有“模糊”的宽度,因为在大多数非东亚字体中它是一个窄字符,但在大多数亚洲字体中则被渲染为全角字符。没有上下文,程序无法知道它在屏幕上会显示多宽。不幸的是,Python的Unicode系统似乎没有任何提供上下文的方式。
一种解决方法可能是将有问题的点替换为具有明确宽度的点,例如U+30FB片假名中间点(始终是全角)。这样,填充逻辑就能识别出该行需要额外的空间。
另一种解决方法可能是将控制台设置为使用具有更多西方中间点字符处理的字体,而不是当前遵循东亚渲染风格将其呈现为全角的字体。这意味着现有的填充是正确的。你从R中得到的输出显然使用了不同的字体,所以它的字体将点呈现为半角。

谁能帮我修改prettytable源代码中的错误?我已经尝试理解源代码,但对于掌握它来说仍然有困难。 - showkey
代码的相关部分在这里。问题是如何处理歧义。如果你只需要一个粗略的修复来供自己使用,你可以简单地添加0xB7作为额外的情况,将其视为宽度2,但这可能不是上游人员关心的事情。更好的解决方案是向宽度函数传递一些额外的参数,告诉它是否处于东亚语境中,但这需要更多的工作来设置。 - Blckknght
当我将你提到的那两行代码添加到我的prettytable模块副本中时,我得到了正确间隔的输出。只要将新代码行放在# Take a guess注释和接下来的return语句之上,它就应该可以工作。 - Blckknght
@it_is_a_literature: 嗯,你不应该需要重新下载它,因为你的系统中已经有了一个副本,因为你能够执行 from prettytable import PrettyTable。只需找到现有的副本并进行编辑即可。可以通过执行 import prettytable; print(prettytable.__file__) 找到其位置。 - Blckknght
print(prettytable.file) D:\python33\lib\site-packages\prettytable-0.7.2-py3.3.egg\prettytable.py ,为什么我在prettytable-0.7.2-py3.3.egg中找不到prettytable.py文件?我该如何更改呢?
- showkey
显示剩余4条评论

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