右对齐包含泰语字符的字符串

时间:2012-11-29 20:02:26

标签: python justify thai southeast-asian-languages

我想对包含泰语字符的字符串进行右对齐(泰语渲染不是从左到右工作,但也可以上下移动。)

例如,对于字符串ไป(两个字符,长度为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个位置。

4 个答案:

答案 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)

<强>原因

泰语脚本包含普通字符(正向前进宽度)和非间距标记(零前进宽度)。

例如,在单词ซื้อ中:

  1. 第一个字符是初始辅音 "SO SO"
  2. 然后它有元音标记 SARA UUE
  3. 然后音标MAI THO
  4. 然后 final伪辅音 O ANG
  5. 问题是上面列表中的字符## 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('บอินทัช'))