2015-05-05 18 views
7

Bunun gibi soruların daha önce sorulmuş olduğunu biliyorum. Ama ben bir çözüm bulamıyorum.Python altprogramı bir unicode hazırlayıcısı yankılanıyor

Python dosyasında tanımlanan unicode literal öğesini alt işlem modülü ile kullanmak istiyorum. Ama ihtiyacım olan sonuçları almıyorum. Ben

# -*- coding: utf-8 -*- 
import sys 
import codecs 
import subprocess 
cmd = ['echo', u'你好'] 
new_cmd = [] 
for c in cmd: 
    if isinstance(c,unicode): 
     c = c.encode(sys.getfilesystemencoding()) 
    new_cmd.append(c) 
subprocess.call(new_cmd) 

kodunu değiştirirseniz Örneğin aşağıdaki kod

# -*- coding: utf-8 -*- 
import sys 
import codecs 
import subprocess 
cmd = ['echo', u'你好'] 
new_cmd = [] 
for c in cmd: 
    if isinstance(c,unicode): 
     c = c.encode('utf-8') 
    new_cmd.append(c) 
subprocess.call(new_cmd) 

yazdırır

你好 

Ben bu aşamada

?? 

aşağıdaki olsun sadece farzediyorum, tekrarlıyorum, g basit bir hata. Ama ne olduğunu anlamaya zor bir zaman geçiriyorum. Nasıl python en alt işlemi yoluyla çağrıldığında aşağıdaki yazdırmak için yankı alabilirsiniz

你好 

Düzenleme:

Python sürümü 2.7 olduğunu. Windows 8'de çalışıyorum ama çözümün platformdan bağımsız olmasını istiyorum.

+0

Yerel ayarı kontrol edin. Https://docs.python.org/2/library/locale.html – oxana

+0

'yı ayarlamaya çalışın. Aslında bu problemi de alabileceğinizi düşündüm. @no_test önerilen yön o zaman muhtemelen daha iyi bir fikir. – cnluzon

+0

@no_test - Bir örneğiniz var mı? Sayfayı okudum ama anlamadım. Bu, bilgisayarlarımın dil sayfalarını ayarlamakla ilgili olduğunu tahmin ederdi. Fakat ekoyu komut satırına kopyalayıp yapıştırabiliyorsam neden gereklidir. Bu karakterleri zaten işlemek mümkün olmaz mı? –

cevap

1

Sonuç: Karakter kodlamalarına dikkat edin (burada üç farklı karakter kodlaması vardır). Taşınabilir Unicode desteğini (Unicode olarak argümanları iletin, bunları kodlama) isterseniz Python 3'ü kullanın ya da verinin ortamdaki geçerli karakter kodlamalarını kullanarak gösterilebildiğinden emin olun (2. sırada yaptığınız gibi Python 2'de sys.getfilesystemencoding() kodunu kullanarak kodlayın) kod örneği).


İlk kod örneği hatalı. etki (IDLE içinde çalıştırmak - py -3 -midlelib) aynıdır:

mbcs codec Windows ANSI code page kullandığı
>>> print(u'你好'.encode('utf-8').decode('mbcs')) #XXX DON'T DO IT! 
你好 

(genellikle: cp1252 karakter kodlamasını - farklı örneğin Rus Windows üzerinde cp1251 olabilir).

Python 2, burada CreateProcessA işlevine eşdeğer bir alt işlem başlatmak için CreateProcess makrolarını kullanır. CreateProcessA, Windows ANSI kodlamanız kullanılarak kodlanmış giriş baytlarını yorumlar. Python kaynak kodunun kodlanması için (durumunuzda utf-8) ilişkisiz'dur.

Yanlış kodlama kullanıyorsanız, mojibake almanız beklenir. girdi karakterleri ve echo if (Unicode bayt şifrelemenin etkin) Windows kod sayfasını gibi cp1252 kullanılarak temsil edilebilir ederseniz ikinci kod örneği çalışması gerekir


(, Windows konsolunda gibi WriteConsoleW() yazdırmak için Unicode API kullanır Python 3 paket win-unicode-console bakınız - bu print(u'你好')neyse sizin CHCP ("OEM") sağlayan sürece konsoldaki yazı veya karakter cmd.exe tarafından kullanılan OEM kod sayfası() bu tür kullanılarak temsil edilebilir) karakterleri destekler gibidir cp437 olarak (sizinkileri öğrenmek için chcp çalıştırın). ?? soru işaretleri, konsol kodlamanız kullanılarak 你好'un temsil edilemeyeceğini belirtir.

Rasgele Unicode argümanlarını desteklemek için (Windows ("ANSI") veya MS-DOS (OEM) kod sayfaları kullanılarak gösterilemeyen karakterler dahil), CreateProcessW işlevine (Python 3 tarafından kullanılır) gereksinim duyarsınız. Bkz Unicode filenames on Windows with Python & subprocess.Popen().

+0

Ne yazık ki bu doğru bir cevap. Python 2.7 ile Windows 8'de Lucida Console yazı tipi etkin olsa bile, tüm karakterleri temsil etmek mümkün değildir. Bunu işe almak için başka bir platforma geçme lüksüne sahiptim. –

+0

@ShaneGannon: Tüm karakterleri (en azından Lucida Console fontu tarafından desteklenenler) gösterebiliriz, örneğin 'ctypes' modülünü kullanarak' CreateProcessW' diyebilirsiniz. [Cevabımdaki son bağlantıya bakın] (http://stackoverflow.com/q/1910275/4279). Ya da Python'dan doğrudan Windows konsoluna Unicode yazmak için ['WriteConsoleW()'] 'ı (http://stackoverflow.com/a/19206014/4279) kullanabilirsiniz. Windows konsolunu desteklemeniz gerekmiyorsa, sadece '' utf-8 '' komutunu kullanın ve çıktıyı bir dosyaya (veya giriş kodlamasını belirtmek için başka bir programa) yönlendirin. – jfs

+0

Lucida Console yazı tipinin desteklemediğini sanmıyorum 你好. Windows utf-8'i kullanmamaya karar verdiğim için benim için iyi çalışıyor. –

2

İlk denemeniz en iyisiydi.

Aslında, b'\xe4\xbd\xa0\xe5\xa5\xbd' veren tüm 2 unicode karakterlerini u'你好' (veya u'\u4f60\u597d') UTF8'ye dönüştürdünüz.

Unicode'u tam olarak destekleyen ve b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8') geri 你好 geri verdiği IDLE'de bunu denetleyebilirsiniz. Bunu kontrol etmenin başka bir yolu, betik çıktısını bir dosyaya yeniden yönlendirmek ve bir UTF-8 uyumlu editör ile açmaktır: yine orada ne istediğinizi göreceksiniz.

Ancak sorun, Windows konsolunun tam unicode'u desteklememesidir. Bu bağlıdır:

  • kod sayfası yüklü - Ben Windows 8 için bilmiyorum ama önceki sürümleri Unicode için kötü desteği vardı ve sadece 256 karakter
  • konsolunda kullanılan yazı tipini gösterebilen - tüm yazı tipleri var tüm karakterler için glifler. Eğer (I do not) senin karakterin motifi içeren bir kod sayfasını biliyorsanız

, sen chcp bir konsolda takın ve explicitely bu şekilde Unicode dize kodlamak için deneyebilirsiniz. Ama fransız makinemde, nasıl yapılacağını bilmiyorum ... bir metin dosyasıyla geçerek hariç!

ConEmu'dan konuştuğunuz gibi, bunu denedim ... ve python 3.4!

chcp 65001 
py -3 
import subprocess 
cmd = ['cmd', '/c', 'echo', u'\u4f60\u597d'] 
subprocess.call(cmd) 

verir:

你好 
0 

sorun yalnızca cmd.exe pencere var!

+0

Bunun gerçekten bir cevap olduğuna emin değilim, çünkü * bunu yap ve * çalışacağım, ama –

+0

hmm ... bazı ipuçları veriyor. "Print b '\ xe4 \ xbd \ xa0 \ xe5 \" python yorumlayıcısından xa5 \ xbd'.decode ('utf-8') ', ama geri döndüğüm her şey "õ ¢ áÕÑ ¢" idi. Can sıkıcı olan şey, benim için sürpriz olan, cmd'yi desteklemiyor. Ancak yine de bu isimde GUI ve Conemu'dan bir klasör oluşturabilirim. Yani bir API/yaklaşım bir yerde var. –

+0

@ShaneGannon: ConEmu kullanmadım (hoş görünüyor ...) ama dahili olarak bir GUI uygulaması olduğu için IDLE'nin sahip olduğu tam unicode desteğine sahip olabilir. Sorun yalnızca bir 'cmd.exe' penceresinde çalışan konsol uygulamaları içindir. –

İlgili konular