当用户输入波斯语或阿拉伯语时,如何在python中使用UTF-8

时间:2017-11-30 08:22:31

标签: python python-2.7 utf-8

我的代码是关于获取某些用户的名称和关于它们的一些要点,并将它们作为表格写入文本文件。例如:

  

19(someSpace *)|حمید

     

20(someSpace *)|وحید

     

70(someSpace *)|خلیل

     

14(someSpace *)|哈密

def roww(STR, n):
    if n >= 10:
        return str(n) +4*" " +"| " + STR + "\n"
    else:
        return str(n) +5*" " +"|" + STR + "\n"

def my_table(STR, m):
    import sys  
    reload(sys)  
    sys.setdefaultencoding('utf8')
    import codecs as D
    f = D.open(STR + '.txt', "w", encoding='utf-8')
    i = 0
    while(i < m):
        i +=1
        a = raw_input("Name: ").encode('utf-8')
        b = raw_input("Grade: ")
        f.write(roww(a,b))
    f.close()
执行时

my_table("grade",3)
Name: حمید

我收到此错误:

    UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-10-a48ceb393d9a> in <module>()
----> 1 my_table("grade",3)

<ipython-input-9-6a83996822a3> in my_table(STR, m)
     14     while(i < m):
     15         i +=1
---> 16         a = raw_input("Name: ").encode('utf-8')
     17         b = raw_input("Grade")
     18         f.write(roww(a,b))

C:\Users\Hamid\Anaconda2\lib\encodings\utf_8.pyc in decode(input, errors)
     14 
     15 def decode(input, errors='strict'):
---> 16     return codecs.utf_8_decode(input, errors, True)
     17 
     18 class IncrementalEncoder(codecs.IncrementalEncoder):

UnicodeDecodeError: 'utf8' codec can't decode byte 0xcd in position 0: invalid continuation byte

我无法用python解决我关于utf-8的问题。我也找不到任何有用的答案。

1 个答案:

答案 0 :(得分:1)

这是一个简单的示例,演示了如何read / decode并编写阿拉伯语文本文件。正如Ilja已经指出的那样,它基本上取决于你的终端,并且当你从终端获得一个已经utf-8编码的字节码时,你实际上必须解码它。

  

在MacOSx上运行良好:

如果您运行此代码段并将其作为输入المدرالمدرالمدر,它将正常工作。

# -*- coding: utf-8 -*-
x = raw_input("test: ").decode("utf-8")
print x
f = open("testarabic.txt", "w")
f.write(x.encode("utf-8"))
f.close()

除非你的python文件中有一些静态文本,否则在你的情况下不需要第一行# -*- coding: utf-8 -*-

  

Windows上的解决方法

我刚试了一下windows,正如你所说,我得到了?????个字符,但我意识到windows命令行正在使用不同的编码。所以第一个问题是,如果你的命令行已经正确地显示了阿拉伯字符,那么通过键入终端

来确定它正在使用的codepage

1)获取终端的代码页

chcp
Active code page:1256

2)使用终端中的活动代码解码原始输入

x = raw_input("test: ").decode("1256")
  

如果Windows上的命令行没有正确显示阿拉伯语符号,您可以通过在Windows命令行中键入chcp 1256

来设置它。