如何在python中删除RTL字符串的最后一个字符?

swa*_*eck 6 python string unicode right-to-left

我试图以"从右到左"的语言删除字符串的最后一个字符.但是,当我这样做时,最后一个字符包裹到字符串的开头.例如 ???????]? 成为 ???????]

我知道这是我处理RTL范式的一个基本问题,但如果有人能帮助我思考它,我会非常感激.

with open(r"file.txt","r") as f:
    for line in f:
        line = unicode(line,'utf-8')
        the_text = line.split('\t')[1]
        the_text.replace(u'\u05C3','')
Run Code Online (Sandbox Code Playgroud)

Ian*_*rts 8

Unicode中的某些字符始终是LTR,有些字符始终是RTL,有些字符可能取决于其周围的上下文.此外,双向文本的显示上下文将具有"主导"方向性(例如,主要为英文文本配置的文本编辑器将主要是LTR并且具有参差不齐的右边距,一个主要配置为希伯来文将主要是RTL,具有衣衫褴褛的左边缘).

看起来这里发生的事情是,当两个RTL字符之间出现一个结束的方括号字符时,它以RTL格式(第一个例子)呈现,但是当它出现在RTL和LTR字符之间时(或者在它结束时) string - 基本上,它在两侧没有相同方向性的其他字符的某个地方)然后它被认为是与主要方向匹配的任何文本行的一部分.如果您尝试将鼠标拖动到字符串上以选择字符,您将在逻辑上看到关闭]仍然遵循??即使在视觉上它似乎已移动的情况.

如果字符串中倒数第二个字符也是希伯来字符(或其他强RTL字符)而不是a ],或者如果显示上下文主要是RTL,那么它将出现在您期望的位置.

  • +1.顺便说一句,如果双向渲染库没有提供告诉它"这是一个主要的RTL文本"的方法,一个选项是添加U + 200F,Unicode [从右到左标记] ](http://en.wikipedia.org/wiki/Right-to-left_mark),在渲染时间之前的字符串的开头和结尾.(不是一个完美的解决方案,但可能适用于典型用途.)**编辑添加:**或类似地,编写`replace(u'\ u05C3',u'\ u200F')`而不是`replace( u'\ u05C3','')`(虽然这有可能在以后产生更多这样的程序员混淆). (4认同)