如何修复prettytable正确显示汉字

时间:2014-04-12 07:33:34

标签: 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)

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 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 

1 个答案:

答案 0 :(得分:5)

您遇到的问题与Python输出错误填充行中的点字符有关。该点是Unicode代码点U+00B7 · middle dot。这个角色被认为有一个不明确的"宽度,因为它在大多数非东亚字体中是一个狭窄的字符,但在大多数亚洲字体中呈现为全宽。没有上下文,程序无法判断它在屏幕上显示的宽度。不幸的是,Python的Unicode系统似乎没有任何方法可以提供该上下文。

一个修复可能是用一个具有明确宽度的点替换有问题的点,例如U+30FB katakana middle dot(总是全宽)。这样,填充逻辑将能够识别该行需要额外的空间。

另一个解决方案可能是将控制台设置为使用对中间点字符进行更多西方处理的字体,而不是当前遵循东亚风格将其呈现为全宽度的字体。这意味着现有的填充是正确的。 R的输出显然使用了Python输出所使用的不同字体,并且其字体将点呈现为半宽。