You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 20:36:03