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

Python 包含泰语字符的右对齐字符串,python,justify,thai,southeast-asian-languages,Python,Justify,Thai,Southeast Asian Languages,我想右对齐包含泰语字符的字符串(泰语渲染从左到右不起作用,但也可以向上和向下) 例如,对于字符串ไป (两个字符,长度2)和ซื้อ (四个字符,长度2)我希望有以下输出(长度5): 天真的 print 'ไป'.decode('utf-8').rjust(5) print 'ซื้อ'.decode('utf-8').rjust(5) 但是,分别产生 ...ไป .ซื้อ 你知道如何获得想要的格式吗 编辑: 给定一个泰语字符tc字符串,我想确定该字符串使用了多少[places/fie

我想右对齐包含泰语字符的字符串(泰语渲染从左到右不起作用,但也可以向上和向下)

例如,对于字符串ไป (两个字符,长度2)和ซื้อ (四个字符,长度2)我希望有以下输出(长度5):

天真的

print 'ไป'.decode('utf-8').rjust(5)

print 'ซื้อ'.decode('utf-8').rjust(5)
但是,分别产生

...ไป

.ซื้อ
你知道如何获得想要的格式吗

编辑:
给定一个泰语字符tc字符串,我想确定该字符串使用了多少[places/fields/positions/您想叫它什么]字符。这与len(tc)不同;len(tc)通常大于使用的位置数。第二个单词给出len(tc)=4,但长度为2/使用2个位置/使用2个位置

我想你想问的是,如何判断剧中人物的“真实”เรือ, ไป, ซื้อ 等(分别为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的角度来看)之间没有真正的相关性


我想不出一个明显的方法来做到这一点。然而,我发现这可能对你有帮助。(您还需要安装一些。

我想您想问的是,如何确定เรือ, ไป, ซื้อ 等(分别为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的角度来看)之间没有真正的相关性

我想不出一个明显的方法来做到这一点。但是,我已经找到了可能对您有帮助的方法。(您还需要安装一些。

它看起来像rjust()函数将不适用于您,您需要自己计算字符串中的单元格数。然后,您可以在字符串前插入所需的空格数以实现对齐

你似乎对泰语很了解。把辅音、前元音、后元音和泰语标点符号的数量加起来。不要计算发音符号和上下元音

比如(请原谅我的伪Python代码)

单元格=0
对于范围内的i(0,len(字符串))
如果(string[i]==\xe31)或((string[i]>=\xe34)和(string[i]=\xe47)和(string[i]),rjust()函数似乎不适用于您,您需要自己计算字符串中的单元格数。然后,您可以在字符串之前插入所需的空格数以实现对齐

你似乎对泰语很了解。把辅音、前元音、后元音和泰语标点符号的数量加起来。不要计算发音符号和上下元音

比如(请原谅我的伪Python代码)

单元格=0
对于范围内的i(0,len(字符串))
如果(字符串[i]=\xe31)或((字符串[i]>=\xe34)和(字符串[i]=\xe47)和(字符串[i]原因

泰语脚本包含普通字符(正进位宽度)和非间隔标记(零进位宽度)

例如,在单词
ซื้อ

  • 第一个字符是第一个辅音“SO SO”
  • 然后它有元音标记SARA UUE
  • 然后是音调标记
    MAI THO
  • 然后是最后一个伪辅音
    oang
  • 问题是上面列表中的字符##2和3是零宽度字符
    换句话说,它们不会使字符串“更宽”。
    换句话说,
    ซื้อ(“购买”)和
    ซอ(“fiddle”)的两个字符位置的宽度相等(但相应的字符串长度为4和2)

    解决方案

    为了计算“实际”字符串长度,必须跳过零宽度字符

    特定于Python的

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

    unicodedata.category(unichr)
    方法一包括以下内容:

    • “Lo”
      表示普通字符
    • “Mn”
      用于零宽度非间距标记
    剩下的是显而易见的,只需过滤掉后一种


    进一步资料:

    • (滚动至第一次出现“泰语字符”)
      • 原因

        泰语脚本包含普通字符(正进位宽度)和非间隔标记(零进位宽度)

        例如,在单词
        ซื้อ

      • 第一个字符是第一个辅音“SO SO”
      • 然后它有元音标记SARA UUE
  • 然后是音调标记
    MAI THO
  • 然后是最后一个伪辅音
    oang
  • 问题是上面列表中的字符##2和3是零宽度字符
    换句话说,它们不会使字符串“更宽”。
    换句话说,
    ซื้อ(“购买”)和
    ซอ(“fiddle”)的两个字符位置的宽度相等(但相应的字符串长度为4和2)

    解决方案

    为了计算“实际”字符串长度,必须跳过零宽度字符

    特定于Python的

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

    unicodedata.category(unichr)
    方法一包括以下内容:

    <