微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

修复python中从右到左书写的问题

如何解决修复python中从右到左书写的问题

我正在尝试将脚本的输出写入 file.txt,但是当我写入阿拉伯字符时,文件上的输出是从右向左写入的。
这是我的脚本:

import unicodedata
import sys
from tabulate import tabulate

headers=["Unicode Point","Character in UTF-8 + length","Character normalized + legth"]
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')
    str2 = char8 + " ---> " + str(len(char8))
    str3 = char8norm + " ---> " + str(len(char8norm))
    data.append([str1,str2,str3])
f.write(tabulate(data,headers=["Unicode Point","Character normalized + legth"]))

这是输出的例子:

U+fb16           ﬖ ---> 1                       վն ---> 2
U+fb17           ﬗ ---> 1                       մխ ---> 2
U+fb1d           יִ ---> 1                       יִ ---> 2
U+fb1f           ײַ ---> 1                       ײַ ---> 2
U+fb2a           שׁ ---> 1                       שׁ ---> 2

如何避免这种情况并像前两行一样打印/保存输出

解决方法

将字符包裹在从左到右的覆盖中:

import unicodedata
import sys
from tabulate import tabulate

ltr = '\N{LEFT-TO-RIGHT OVERRIDE}'

headers=["Unicode","Character + UTF-8 length","NFKC + UTF-8 length"]
data = []
for i in range (sys.maxunicode + 1):
    uni = chr(i)
    nfkc = unicodedata.normalize('NFKC',uni)
    if len(uni) != len(nfkc):
        str1 = f'U+{i:04X}'
        str2 = f'{ltr}{uni}{ltr} ---> {len(uni.encode())}'
        str3 = f'{ltr}{nfkc}{ltr} ---> {len(nfkc.encode())}'
        data.append([str1,str2,str3])

with open('multiplierNFD.txt','w',encoding='utf8') as f:
    f.write(tabulate(data,headers=headers))

输出示例:

Unicode    Character + UTF-8 length    NFKC + UTF-8 length
---------  --------------------------  --------------------------
...
U+FB16     ‭ﬖ‭ ---> 3                    ‭վն‭ ---> 4
U+FB17     ‭ﬗ‭ ---> 3                    ‭մխ‭ ---> 4
U+FB1D     ‭יִ‭ ---> 3                    ‭יִ‭ ---> 4
U+FB1F     ‭ײַ‭ ---> 3                    ‭ײַ‭ ---> 4
U+FB2A     ‭שׁ‭ ---> 3                    ‭שׁ‭ ---> 4
...

我还对代码进行了一些清理,并像标题所说的那样输出 UTF-8 长度,而不是代码点长度。不要将 Unicode 代码点与 UTF-8 编码混淆。例如,这什么都不做:

char8 = uni.encode('utf8','ignore').decode('utf8','ignore')

所有代码点都可以用 UTF8 编码,所以没有什么可以忽略的,解码会再次将其转换回原始字符,所以 uni == char8 在您的代码中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。