2015-07-17 12 views
6

Python 3 kullanıyorum (kısa bir süre önce Python 2'den geçiş yapılıyor). Kodum genellikle Linux üzerinde çalışır, ancak bazen (bazen) Windows'da çalışır. open() için Python 3 belgelerine göre, bir metin dosyası için varsayılan kodlama, encoding arg numarası verilmediyse locale.getpreferredencoding()'dan sağlanır. İşletim sistemi üzerinde çalışan bir sistem için bu varsayılan değerin utf-8 olmasını istiyorum (şu anda Linux için her zaman UTF-8, Windows için değil). Projenin open() numarasına çok fazla çağrı var ve hepsine encoding='utf-8' eklemek istemiyorum. Böylece, Python 3'ün göreceği gibi, yerelde tercih edilen kodlamayı Windows'da değiştirmek istiyorum.Windows'da Python 3'te “yerel tercih edilen kodlama” yı değiştirmek

Daha önce bir soru sordu "Changing the "locale preferred encoding"", kabul edilmiş bir cevabı var, bu yüzden gitmek için iyi olduğunu düşündüm. Ancak maalesef, bu cevabın önerdiği komutların hiçbiri ve ilk yorumu Windows'da benim için işe yaramıyor. Özel olarak, bu kabul edilen yanıt ve ilk yorumu, chcp 65001 ve set PYTHONIOENCODING=UTF-8'u çalıştırmayı önerdi ve ikisini de denedim. Benim cmd penceresinden aşağıya transkript bakın: Her iki komutları önerdi sonra bile, benim açılan dosyanın kodlama hala yerine amaçlanan utf-8 arasında cp1252 olan

> 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() 

Not.

+0

Belki de sadece benim tarzımdır, ancak kodlamayı belirttiğiniz bir wrapper open() işlevini yazmayı tercih ederim. –

+0

'chcp 65001' kullanmayın. Windows konsolu UTF-8'i düzgün şekilde desteklemiyor ve istediğinizi yapmayacaksınız. 'locale.getpreferredencoding' konsol kodu sayfası ile ilgisi yoktur; Windows yerel ayarlarının ANSI kodlamasına dayanır. Örneğin, 'CreateFileW' (UTF-16) yerine Win32' CreateFileA' (ANSI) çağırırsanız, dosya yolu dizesi bir ANSI dizesi (örneğin, Windows-1252) olarak çözülür. Windows, UTF-8'in ANSI karakter kümesi olarak kullanılmasına izin vermez ve C çalışma zamanı, bir yerel ayar için UTF-8 kullanılmasına da izin vermez. – eryksun

+0

@eryksun Bilgi için teşekkürler, ancak benim için çok fazla Windows'a özgü jargon var. Nadiren Windows kullanıyorum. Tek istediğim, Windows 8 ya da Python 3'e söylemek için bir yol: "Sevgili Windows 8/Python 3, Lütfen bu bilgisayardaki tüm metin dosyalarının istisnasız olarak UTF-8 olarak kodlanması gerektiğini unutmayın. Lütfen bu gerçeği hatırlayın. Gelecekte metin dosyalarını açarken. Teşekkürler. " – walrus

cevap

3

i onun bir gerçek hacky geçici çözüm biliyorum ama şöyle locale.getpreferredencoding() işlevini yeniden tanımlamak olabilir:

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

erkenden bu çalıştırırsanız, tüm dosyalar bir kazan xp benim testlerde Diye de (sonra açıldı makine) utf-8'de açın ve bu modül modülünü geçersiz kıldığından, tüm platformlar için geçerli olacaktır.

+0

Bunu python 3.5.1 ve Windows 7 üzerinde test ettim ve neye son verdiğimi (http://stackoverflow.com/a/34345136/4933641). – axil

3

python3.5.1 itibariyle bu hack şuna benzer: bundan sonra açıldı

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

Tüm dosyalar utf8 olmak varsayılan kodlamayı üstlenecek.

+0

Veya daha iyisi, 'utf_8_sig', bazı Windows editörlerinin, 'utf8' gibi endian-nötr kodlama için bile dosyalara yerleştirme eğiliminde olduğu BOM karakterine dikkat edecektir. – axil

İlgili konular