1

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

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

4 回答 4

1

原因

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

例如,在单词中ซื้อ

  1. 第一个字符是声母 "SO SO"
  2. 然后它有元音标记 SARA UUE
  3. 然后音标MAI THO
  4. 然后是最后的伪辅音 O ANG

问题是上面列表中的字符 ##2 和 3 是零宽度的
换句话说,它们不会使字符串“更宽”。
换句话说,ซื้อ("to buy") 和ซอ("fiddle") 将具有相等的两个字符位置的宽度(但相应的字符串长度为 4 和 2)。

解决方案

为了计算“真正的”字符串长度,必须跳过零宽度字符。

特定于 Python 的

unicodedata模块提供对 Unicode 字符数据库 (UCD) 的访问,该数据库定义了所有 Unicode 字符的字符属性。该数据库中包含的数据是从 UCD 版本 8.0.0 编译而来的。

unicodedata.category(unichr)方法返回以下常规类别值之一:

  • "Lo"对于正常字符;
  • "Mn"用于零宽度非间距标记;

其余的很明显,只需过滤掉后者。


更多信息:

于 2016-02-13T00:52:04.893 回答
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

เรือ</p>

>>> 'เรือ'
'\xe0\xb9\x80\xe0\xb8\xa3\xe0\xb8\xb7\xe0\xb8\xad'

>>> len('เรือ')
12
>>> len('เรือ'.decode('utf-8'))
4

显示的字符数与构成字符串的实际(从 Python 的角度)字符数之间没有真正的相关性。

我想不出一个明显的方法来做到这一点。但是,我发现这个库可能对你有帮助。(您还需要安装一些先决条件

于 2012-11-29T22:25:48.577 回答
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++
于 2016-02-12T22:38:09.393 回答
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('บอินทัช'))
于 2019-10-17T13:54:23.170 回答