我的代码是关于获取某些用户的名称和关于它们的一些要点,并将它们作为表格写入文本文件。例如:
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的问题。我也找不到任何有用的答案。
答案 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