]> granicus.if.org Git - python/commitdiff
Issue #4815: Offer conversion to UTF-8 if source files have
authorMartin v. Löwis <martin@v.loewis.de>
Sun, 18 Jan 2009 20:23:36 +0000 (20:23 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sun, 18 Jan 2009 20:23:36 +0000 (20:23 +0000)
no encoding declaration and are not encoded in UTF-8.

Lib/idlelib/IOBinding.py
Lib/idlelib/NEWS.txt

index 71c0163aff85bd30a93c3bc773e1e291d5b6082a..1b7bfc1da9c418fc31e1f17e6e8b32a986180909 100644 (file)
@@ -7,7 +7,7 @@ import tkinter.filedialog as tkFileDialog
 import tkinter.messagebox as tkMessageBox
 import re
 from tkinter import *
-from tkinter.simpledialog import SimpleDialog
+from tkinter.simpledialog import askstring
 
 from idlelib.configHandler import idleConf
 
@@ -211,7 +211,7 @@ class IOBinding:
         except IOError as msg:
             tkMessageBox.showerror("I/O Error", str(msg), master=self.text)
             return False
-        chars = self._decode(two_lines, bytes)
+        chars, converted = self._decode(two_lines, bytes)
         if chars is None:
             tkMessageBox.showerror("Decoding Error",
                                    "File %s\nFailed to Decode" % filename,
@@ -227,6 +227,10 @@ class IOBinding:
         self.text.insert("1.0", chars)
         self.reset_undo()
         self.set_filename(filename)
+        if converted:
+            # We need to save the conversion results first
+            # before being able to execute the code
+            self.set_saved(False)
         self.text.mark_set("insert", "1.0")
         self.text.see("insert")
         self.updaterecentfileslist(filename)
@@ -241,11 +245,11 @@ class IOBinding:
                 chars = bytes[3:].decode("utf-8")
             except UnicodeDecodeError:
                 # has UTF-8 signature, but fails to decode...
-                return None
+                return None, False
             else:
                 # Indicates that this file originally had a BOM
                 self.fileencoding = 'BOM'
-                return chars
+                return chars, False
         # Next look for coding specification
         try:
             enc = coding_spec(two_lines)
@@ -257,36 +261,48 @@ class IOBinding:
                 master = self.text)
             enc = None
         except UnicodeDecodeError:
-            return None
+            return None, False
         if enc:
             try:
                 chars = str(bytes, enc)
                 self.fileencoding = enc
-                return chars
+                return chars, False
             except UnicodeDecodeError:
                 pass
         # Try ascii:
         try:
             chars = str(bytes, 'ascii')
             self.fileencoding = None
-            return chars
+            return chars, False
         except UnicodeDecodeError:
             pass
         # Try utf-8:
         try:
             chars = str(bytes, 'utf-8')
             self.fileencoding = 'utf-8'
-            return chars
+            return chars, False
         except UnicodeDecodeError:
             pass
         # Finally, try the locale's encoding. This is deprecated;
         # the user should declare a non-ASCII encoding
         try:
-            chars = str(bytes, locale_encoding)
-            self.fileencoding = locale_encoding
-        except UnicodeDecodeError:
+            # Wait for the editor window to appear
+            self.editwin.text.update()
+            enc = askstring(
+                "Specify file encoding",
+                "The file's encoding is invalid for Python 3.x.\n"
+                "IDLE will convert it to UTF-8.\n"
+                "What is the current encoding of the file?",
+                initialvalue = locale_encoding,
+                parent = self.editwin.text)
+
+            if enc:
+                chars = str(bytes, enc)
+                self.fileencoding = None
+            return chars, True
+        except (UnicodeDecodeError, LookupError):
             pass
-        return chars  # None on failure
+        return None, False  # None on failure
 
     def maybesave(self):
         if self.get_saved():
index 94ab7f74622d213a683dd304927c3cd304e27ba0..3279299525c2ef5fcff30495663d1e8bef532a49 100644 (file)
@@ -3,6 +3,9 @@ What's New in IDLE 3.1a1?
 
 *Release date: XX-XXX-XXXX*
 
+- Issue #4815: Offer conversion to UTF-8 if source files have
+  no encoding declaration and are not encoded in UTF-8.
+
 - Issue #4008: Fix problems with non-ASCII source files.
 
 - Issue #4323: Always encode source as UTF-8 without asking