Index: Lib/idlelib/ScriptBinding.py =================================================================== --- Lib/idlelib/ScriptBinding.py (révision 66703) +++ Lib/idlelib/ScriptBinding.py (copie de travail) @@ -52,17 +52,28 @@ self.flist = self.editwin.flist self.root = self.editwin.root + def detect_encoding(self, filename): + """ + Detect the encoding of a Python script: find the "#coding:" header at line + 1 or line 2. + """ + f = open(filename, 'rb') + encoding, line = tokenize.detect_encoding(f.readline) + f.close() + return encoding + def check_module_event(self, event): + encoding = self.detect_encoding(filename) filename = self.getfilename() if not filename: return 'break' - if not self.checksyntax(filename): + if not self.checksyntax(filename, encoding): return 'break' - if not self.tabnanny(filename): + if not self.tabnanny(filename, encoding): return 'break' - def tabnanny(self, filename): - f = open(filename, 'r') + def tabnanny(self, filename, encoding): + f = open(filename, 'r', encoding=encoding) try: tabnanny.process_tokens(tokenize.generate_tokens(f.readline)) except tokenize.TokenError as msg: @@ -78,11 +89,11 @@ return False return True - def checksyntax(self, filename): + def checksyntax(self, filename, encoding): self.shell = shell = self.flist.open_shell() saved_stream = shell.get_warning_stream() shell.set_warning_stream(shell.stderr) - f = open(filename, 'r') + f = open(filename, 'r', encoding=encoding) source = f.read() f.close() if '\r' in source: @@ -121,10 +132,11 @@ filename = self.getfilename() if not filename: return 'break' - code = self.checksyntax(filename) + encoding = self.detect_encoding(filename) + code = self.checksyntax(filename, encoding) if not code: return 'break' - if not self.tabnanny(filename): + if not self.tabnanny(filename, encoding): return 'break' shell = self.shell interp = shell.interp