Python脚本写入文件时阿拉伯等RTL字符右到左排版问题如何解决
问题根因
你遇到的排版问题是Unicode双向排版算法(BiDi) 导致的:阿拉伯语、希伯来语等字符属于右至左(RTL)属性的字符,普通文本编辑器检测到这类字符后,会自动调整后续内容的排版方向,这是显示层面的逻辑,和你写入文件的UTF-8编码没有关系。
解决方法
在每个包含特殊字符的字段开头插入左至右强制控制符(LRM,Unicode码位U+200E),即可强制整行保持左到右排版,不会被RTL字符触发方向切换。
修改后的代码如下
import unicodedata import sys from tabulate import tabulate # 原表头的length拼写错误,这里修正 headers=["Unicode Point", "Character in UTF-8 + length", "Character normalized + length"] data = [] f = open('multiplierNFD.txt', 'a', encoding='utf8') for i in range (sys.maxunicode + 1): uni = chr(i) char8 = uni.encode('utf8', 'ignore').decode('utf8', 'ignore') char8norm = unicodedata.normalize('NFKC', char8) if len(char8) != len(char8norm): if i < 65535: str1 = "U+" + str(hex(i))[2:].rjust(4,'0') else: str1 = "U+" + str(hex(i))[2:].rjust(8,'0') # 字段开头加LRM控制符,强制左到右排版 str2 = '\u200e' + char8 + " ---> " + str(len(char8)) str3 = '\u200e' + char8norm + " ---> " + str(len(char8norm)) data.append([str1, str2, str3]) f.write(tabulate(data, headers=headers)) f.close()
补充说明
- LRM是不可见的控制字符,不会修改你要存储的原始字符内容,只会作用于编辑器的显示逻辑,绝大多数文本编辑器都支持该控制符
- 如果你不想在文件中加入控制字符,也可以将RTL字符转换为Unicode转义序列输出(比如
\ufb1d这种格式),但会降低内容可读性 - 如果后续需要输出到HTML等富文本场景,可给对应元素添加
dir="ltr"属性实现同样效果,纯文本场景优先使用LRM控制符
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

