我知道可以用这种方式声明编码:
# -*- coding: utf-8 -*-
但是当我尝试在文件中写'ñ'时,会写'Ã'而不是。
我也尝试过这种方式(就像在文档中写here)
import codecs
f = codecs.open('output', encoding='utf-8')
f.write("ñÑ")
但它提出了:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
答案 0 :(得分:6)
您正在使用codecs.open()
,生成需要 unicode
个对象的文件对象。但是,您传入一个字节字符串,因此Python必须首先使用默认的ASCII编解码器解码为unicode
。这就是为什么你得到一个解码错误,其中ASCII编解码器无法解码你的UTF-8字节。
解码字符串,使用unicode
字符串文字,或使用open()
代替codecs.open()
。
其中每一项都有效:
# -*- coding: utf-8 -*-
import codecs
with codecs.open('output', encoding='utf-8') as f:
f.write(u"ñÑ")
或
# -*- coding: utf-8 -*-
import codecs
with codecs.open('output', encoding='utf-8') as f:
f.write("ñÑ".decode('utf8'))
或
# -*- coding: utf-8 -*-
with open('output') as f:
f.write("ñÑ")
codecs.open()
确实采用了编解码器,但它告诉文件对象如何将unicode
个对象编码为字节。
答案 1 :(得分:1)
试试#!/usr/bin/env python3
# coding: utf-8
import tkinter as tk
from tkinter import ttk
class SpiderGUI():
def __init__(self, master):
self.master = master
self.frame = ttk.Frame(self.master, padding=(10, 10, 10, 10))
self.frame.pack(fill="both", expand="True")
self.paned_window = ttk.Panedwindow(self.frame, orient="horizontal")
self.paned_window.pack(fill="both", expand="True")
self.frame_settings = ttk.Frame(self.paned_window, width=75, height=300, relief="sunken")
self.paned_window.add(self.frame_settings)
self.frame_output = ttk.Frame(self.paned_window, width=950, height=300, relief="sunken")
self.paned_window.add(self.frame_output, weight="4")
self.frame_logging = ttk.Frame(self.paned_window, width=175, height=500, relief="sunken")
self.paned_window.add(self.frame_logging)
self.console_notebook = ttk.Notebook(self.frame_output)
self.console_notebook.pack()
self.frame_tab_console = ttk.Frame(self.console_notebook)
self.console_notebook.add(self.frame_tab_console, text="Console", padding=(10))
self.frame_tab_database = ttk.Frame(self.console_notebook)
self.console_notebook.add(self.frame_tab_database, text="MongoDB")
def main():
root = tk.Tk()
app = SpiderGUI(root)
# root.geometry(newGeometry="1200x800+100+100")
root.title('name')
root.resizable(width=True, height=False)
# root.maxsize(width=1280, height=1024)
# root.minsize(width=640, height=480)
root.mainloop()
if __name__ == '__main__':
main()
字符串前面的u使它成为另一种字符串......