it_*_*ure 7 r python-3.x prettytable
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)
Run Code Online (Sandbox Code Playgroud)

我想要的输出格式如下.

在这个例子中,prettytable.py无法显示字符的正确中国暧昧宽度 ·在 ????·??? ,则字符含糊的宽度.如何修复prettytable.py中的错误?
我在prettytable.py的def _char_block_width(char)中添加了两行,但问题仍然存在.
if char == 0xb7:
return 2
Run Code Online (Sandbox Code Playgroud)
我已经解决了,文件prettytable.py应该安装在我的电脑d:\ python33\Lib\site-packages中directly not in as the form of d:\python33\Lib\site-packages\prettytable\prettytable.py
有很多中文字符宽度不明确,我们添加两行如下来修复bug是愚蠢的,如果有50个不明确的字符,在prettytable.py中会添加100行,有没有简单的方法要做到这一点?只修一些线来对待所有模棱两可的角色?
if char == 0xb7:
return 2
Run Code Online (Sandbox Code Playgroud)
您遇到的问题与Python输出的错误填充行中的点字符有关。点是Unicode代码点U+00B7 · middle dot。该字符被认为具有“歧义”的宽度,因为在大多数非东亚字体中它是一个狭窄的字符,但在大多数亚洲字体中却被呈现为全角。没有上下文,程序将无法判断它在屏幕上显示的宽度。不幸的是,Python的Unicode系统似乎没有提供这种上下文的任何方法。
一种解决方法是用一个具有明确宽度的点(例如U+30FB katakana middle dot(始终为全角))替换有问题的点。这样,填充逻辑将能够识别该行需要额外的空间。
另一种解决方案是将您的控制台设置为使用一种对中点字符进行更多西式处理的字体,而不是使用遵循东亚风格将其呈现为全角的当前字体。这将意味着现有的填充是正确的。来自R的输出显然使用了与Python输出不同的字体,并且其字体将点呈现为半角。