2015-07-17 9 views
6

Sto usando Python 3 (recentemente passato da Python 2). Il mio codice di solito gira su Linux ma anche a volte (non spesso) su Windows. Secondo la documentazione di Python 3 per open(), la codifica predefinita per un file di testo è da locale.getpreferredencoding() se non viene fornito l'argomento encoding arg. Voglio che questo valore predefinito sia utf-8 per un mio progetto, indipendentemente dal sistema operativo su cui è in esecuzione (al momento, è sempre UTF-8 per Linux, ma non per Windows). Il progetto ha molte chiamate a open() e non voglio aggiungere a tutti encoding='utf-8'. Quindi, voglio cambiare la codifica preferita della locale in Windows, come lo vede Python 3.Modifica della "lingua preferita codifica" in Python 3 in Windows

Ho trovato una domanda precedente "Changing the "locale preferred encoding"", che ha una risposta accettata, quindi ho pensato che ero a posto. Ma sfortunatamente, nessuno dei comandi suggeriti in quella risposta e il suo primo commento funzionano per me in Windows. In particolare, quella risposta accettata e il suo primo commento suggeriscono di eseguire chcp 65001 e set PYTHONIOENCODING=UTF-8, e ho provato entrambi. Si prega di consultare la trascrizione di sotto dalla mia finestra cmd:

> py -i 
Python 3.4.3 ... 
>>> f = open('foo.txt', 'w') 
>>> f.encoding 
'cp1252' 
>>> exit() 

> chcp 65001 
Active code page: 65001 

> py -i 
Python 3.4.3 ... 
>>> f = open('foo.txt', 'w') 
>>> f.encoding 
'cp1252' 
>>> exit() 

> set PYTHONIOENCODING=UTF-8 

> py -i 
Python 3.4.3 ... 
>>> f = open('foo.txt', 'w') 
>>> f.encoding 
'cp1252' 
>>> exit() 

Nota che, anche dopo che entrambi hanno suggerito i comandi, la codifica del mio file aperto è ancora cp1252 al posto del previsto utf-8.

+0

Forse è solo il mio stile, ma preferirei scrivere una funzione wrapper open() in cui si specifica la codifica. –

+0

Non utilizzare 'chcp 65001'. La console di Windows non supporta correttamente UTF-8, e non sta facendo quello che vuoi comunque. 'locale.getpreferredencoding' non ha nulla a che fare con la codepage della console; è basato sulla codifica ANSI delle impostazioni locali di Windows. Ad esempio, se si chiama Win32 'CreateFileA' (ANSI) anziché' CreateFileW' (UTF-16), la stringa del percorso file viene decodificata come stringa ANSI (ad esempio Windows-1252). Windows non consente di utilizzare UTF-8 come set di caratteri ANSI e anche il runtime C non consente l'utilizzo di UTF-8 per le impostazioni internazionali. – eryksun

+0

@eryksun Grazie per le informazioni, ma ha troppo gergo specifico per Windows per me. Uso raramente Windows. Tutto ciò che voglio è un modo per dire a Windows 8 o a Python 3: "Caro Windows 8/Python 3, tieni presente che tutti i file di testo su questo computer devono essere codificati in UTF-8, senza eccezioni. in futuro quando apri file di testo. Grazie. " – walrus

risposta

3

So che è un vero e proprio soluzione hacky, ma si potrebbe ridefinire la funzione locale.getpreferredencoding() in questo modo:

import locale 
def getpreferredencoding(do_setlocale = True): 
    return "utf-8" 
locale.getpreferredencoding = getpreferredencoding 

se si esegue questa fase iniziale, tutti i file aperti dopo (a affinchè non nel mio test su una win xp macchina) aperto in utf-8, e poiché questo sovrascrive il metodo del modulo questo si applicherebbe a tutte le piattaforme.

+0

L'ho provato su python 3.5.1 e Windows 7 e [dai un'occhiata] (http://stackoverflow.com/a/34345136/4933641) con cosa ho finito. – axil

3

partire python3.5.1 questo hack si presenta così:

import _locale 
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8']) 

Tutti i file aperti da allora in poi si assumono la codifica predefinita per essere utf8.

+0

O meglio ancora, 'utf_8_sig' poiché si prenderà cura del carattere BOM che alcuni editor di Windows tendono ad iniettare nei file anche per una codifica endian-neutra come' utf8'. – axil