我想对包含泰语字符的字符串进行右对齐(泰语渲染不是从左到右工作,但也可以上下移动。)
例如,对于字符串ไป(两个字符,长度为2)和ซื้อ(四个字符,长度为2),我希望得到以下输出(长度为5):
...ไป
...ซื้อ
天真的
print 'ไป'.decode('utf-8').rjust(5)
print 'ซื้อ'.decode('utf-8').rjust(5)
然而,分别产生
...ไป
.ซื้อ
有关如何获得所需格式的任何想法吗?
编辑: 给定一串泰语字符tc,我想确定该字符串使用的[字段/字段/位置/您想要调用它的数量]。这与len(tc)不同; len(tc)通常大于使用的地方数量。第二个单词给出len(tc)= 4,但长度为2 /使用2个位置/使用2个位置。
答案 0 :(得分:0)
我认为您要问的是,如何确定เรือ,ไป,ซื้อ等中的'真'字符数(分别为3,2和2)
不幸的是,这是Python解释这些字符的方式:
ไป
>>> 'ไป'
'\xe0\xb9\x84\xe0\xb8\x9b'
>>> len('ไป')
6
>>> len('ไป'.decode('utf-8'))
2
ซื้อ
>>> 'ซื้อ'
'\xe0\xb8\x8b\xe0\xb8\xb7\xe0\xb9\x89\xe0\xb8\xad'
>>> len('ซื้อ')
12
>>> len('ซื้อ'.decode('utf-8'))
4
เรือ
>>> 'เรือ'
'\xe0\xb9\x80\xe0\xb8\xa3\xe0\xb8\xb7\xe0\xb8\xad'
>>> len('เรือ')
12
>>> len('เรือ'.decode('utf-8'))
4
显示的字符数与组成字符串的实际(来自Python的透视)字符之间没有真正的关联。
我想不出一个明显的方法来做到这一点。但是,我发现this library可能对您有所帮助。 (您还需要安装一些prequisites。
答案 1 :(得分:0)
看起来rjust()函数对你不起作用,你需要自己计算字符串中的单元格数。然后,您可以在字符串之前插入所需的空格数以实现对齐
您似乎了解泰语。在元音和泰语标点符号之后,对前面元音的辅音数量求和。不要计算变音符号以及元音的上方和下方。
像(原谅我的伪Python代码),
cells = 0
for i in range (0, len(string))
if (string[i] == \xe31) or ((string[i] >= \xe34) and (string[i] <= \xe3a)) or ((string[i] >= \xe47) and (string[i] <= \xe4e))
# do nothing
else
# consonant, preceding or following vowel or punctuation
cells++
答案 2 :(得分:0)
<强>原因强>
泰语脚本包含普通字符(正向前进宽度)和非间距标记(零前进宽度)。
例如,在单词ซื้อ
中:
"SO SO"
,SARA UUE
,MAI THO
,O ANG
问题是上面列表中的字符## 2和3是零宽度字符。
换句话说,他们不会使字符串更宽&#34;。
换句话说,ซื้อ
(&#34;购买&#34;)和ซอ
(&#34;小提琴&#34;)将具有相同宽度的两个字符位置(但字符串长度为4和2,相应地)。
<强>解决方案强>
为了计算&#34;真实&#34;字符串长度,必须跳过零宽度字符。
<强> Python特定强>
unicodedata模块提供对Unicode字符数据库(UCD)的访问,该数据库定义了所有Unicode字符的字符属性。此数据库中包含的数据是从UCD 8.0.0版本编译的。
unicodedata.category(unichr)
方法returns 以下General Category Values:
"Lo"
表示正常人物; "Mn"
用于零宽度非间距标记; 其余的很明显,只是过滤掉后者。
更多信息:
答案 3 :(得分:0)
这是一个根据bytebuster的答案计算泰语字符串长度(水平排列的字符数)的功能
import unicodedata
def get_thai_string_length(string):
length = 0
for c in string:
if unicodedata.category(c) != 'Mn':
length += 1
return length
print(len('บอินทัช'))
print(get_thai_string_length('บอินทัช'))