2016-06-28 39 views
6

Python 3.5 kullanıyorum ve özel Çince karakterler içerebilen veya içermeyen bir metni bayt metni almaya çalışıyorum ve bir dosyaya verdim. Çince karakterler içermeyen girişler için çalışır, ancak yaptıkları zaman kırılır. Çince karakterler her zaman bir kişinin adıdır ve her zaman isimlerinin İngilizce yazımına ek olarak vardır. Metin JSON biçimlendirilmiş ve yüklenemeden önce kodu çözülmesi gerekiyor. Kod çözme iyi gidiyor ve bana herhangi bir hata vermiyor. Ben denemek ve bana aşağıdaki hata iletisini veren bir dosyaya deşifre metni yazarken: Burada Çince karakterlerle Python çözme sorunu

UnicodeEncodeError: 'charmap' codec can't encode characters in position 14-18: character maps to undefined

ben buna bir şey yapmadan önce alıyorum ham verilerin bir örnektir:

b' "isBulkRecipient": "false",\r\n  "name": "Name in, English \xef' 
b'\xab\x62\xb6\xe2\x15\x8a\x8b\x8a\xee\xab\x89\xcf\xbc\x8a",\r\n 

recipientData = json.loads(recipientContent.decode('utf-8', 'ignore')) 
recipientName = recipientData['signers'][0]['name'] 
pprint(recipientName) 
with open('envelope recipient list.csv', 'a', newline='') as fp: 
    a = csv.writer(fp, delimiter=',') 
    csvData = [[recipientName]] 
    a.writerows(csvData) 

recipientContent bir API çağrısı elde edilir:

İşte kullanıyorum kodudur. Çıkış dosyasında Çince karakterlere sahip olmam gerekmiyor. Herhangi bir tavsiye büyük takdir edilecektir!

Güncelleme:

Ben sonları her giriş için bazı manuel geçici çözümler yapıyor ve Çin özel karakterler içermiyordu diğer girdileri geldi, ancak diğer dillerden onları vardı ve aynı programı kırdı oldum iyi. Özel karakterler sadece isim alanındadır. Yani bir isim normal ve özel karakterlerin bir karışımı olduğu "Ałex" gibi bir şey olabilir. Bu bilgiyi içeren dizeyi çözmeden önce ekrana yazdırabilirim ve şu şekilde görünebilir: b'name": "A\xc5ex",\r\n

Ancak utf-8'e çözdükten sonra çıktı almaya çalışırsam bana bir hata verecektir. o. Hata mesajı: UnicodeEncodeError: 'charmap' codec can't encode character 'u0142' in position 2- character maps to -undefined-

Neye dikkat ettim ve ł özel karakteri.

+0

örnek dize (ne de UTF-8 olarak görünmüyor ortak Çinli multibyte herhangi kodlamaları). UTF-8'in kodlanmış olduğundan (hatta Çince) emin misiniz? – univerio

+0

, 'İçerik Türü'nü kontrol etmelisiniz. Eğer uygulama/json ise; charset = utf-16', 'utf-16' kullanın. "Uygulama/json" için varsayılan değer "utf-8" –

+0

% 100 emin değilim çünkü utf-8 web servisinin verileri aldığından çok iyi belgelenmediğinden emin değilim, ancak birkaç tane denedim utf-16 dahil olmak üzere farklı kodlama türleri. Çince karakterler içerdiğinden eminim. –

cevap

0

Uyarı: sadece (yani hepsi diğer alanların gelecekteki işleme için önemli değildir olduğunu) tüm dosyadaki tüm yabancı karakterin kurtulmak istiyorum varsayarsak öncesinde av tüfeği çözüm

, sadece can Eğer tüm aSCII olmayan ch kaldırmak böyle

recipientData = json.loads(recipientContent.decode('ascii', 'ignore')) 

bütün aSCII olmayan karakterler

recipientData = json.loads(recipientContent.decode('utf-8', 'ignore')) 

görmezden gelecekteki işlemeden önce aracıcılar.

Ben belirli koşullar altında düzgün çalışmayabilir, çünkü av tüfeği çözüm denir:

olmayan ASCII karakterleri b'\' veya b" karakter bölümünden örneğin görünür
  • ise ileride kullanılmak üzere tutmak için gerekli olan Açıkçası eğer
    1. bir utf-16 karakterinin.
  • 0

    Dosyaya yazarken karşılaştığınız hata. Python 3'te

    .x,metin modunda (varsayılan) encoding= belirtmeden, Python yerel ayarlarınıza veya dil ayarlarınıza en uygun bir kodlamayı kullanır.

    Windows kullanıyorsanız, bu, dil kodlamanızla eşleştirmek için charmap kodekini kullanacaktır.

    Yalnızca bir dosyaya bayt yazabilseniz de, önce kodu çözerek doğru şeyi yapıyorsunuz demektir. Başkalarının söylediği gibi, web sunucusu tarafından belirtilen kodlamayı kullanarak gerçekten deşifre etmelisiniz. Bunu sizin için yapan Python İstekleri modülünü de kullanabilirsiniz. basitçe Verilerinizde sahip karakterleri destekleyen bir encodingopen() geçmek,

    sizin hemen hatayı çözmek için (You örnek UTF-8 olarak deşifre etmez, bu yüzden senin örneğin doğru değil varsayıyorum). UTF-8 kodlamasında Unicode bariz bir seçimdir. Bu nedenle, okumak için kodunuzu değiştirmeniz gerekir:

    with open('envelope recipient list.csv', 'a', encoding='utf-8', newline='') as fp: 
    
    0

    kodunuzu bu satırı ekleyin:

    from __future__ import unicode_literals 
    
    +0

    Bu neden yardımcı olur? –