Mam kilka ciągów z bazy danych, które wyglądają jak '\xe7\x8e\xa9'.

Myślę, że to UTF-8. Mogę je wydrukować, używając:

print '\xe7\x8e\xa9'
玩

Rzeczy jest, muszę napisać je do innego pliku jako chiński charakter (np. 玩) wraz z innymi danymi alfanumerycznymi.

Próbowałem encode, decode, ale nie dostałem wyników, na które miałem nadzieję.

Oto moje próby:

f = open('a','w')
name = u.name #.encode('utf8')  # I commented it to get raw
f.write('\t$$%r$$many_other_data' % name) 
f.close()

Kiedy otworzę plik wyjściowy VIM7.4:

 `$$u'\u7aef\u5e84\u7684\u9a6c\u6b47\u5c14$$many_other_data'`
1
Zen 12 sierpień 2014, 13:54

3 odpowiedzi

Najlepsza odpowiedź

Oto przykładowa próbka kodu dla mnie:

with open('foo', 'w+') as f:
    f.write('\xe7\x8e\xa9')

I w foo plik ma:

Ale otworzyłem foo za pomocą kodowania UTF-8, więc wyświetla chińskie znaki zamiast wartości Unicode.

Przetestowałem go zarówno Vimiem, jak i Geditem i działa dobrze.

Być może powinieneś podać typ pliku wyjściowego, abyśmy mogli być bardziej szczegółowo.

EDYTUJ

Teraz widzę problem. Użyłeś %r flag na pisząc swój ciąg. Powinieneś użyć %s (i włącz kodowanie ponownie).

Oto przykład pracy:

>>> a = u'\u7aef\u5e84\u7684\u9a6c\u6b47\u5c14'
>>> f = open('tmp', 'w')
>>> a = a.encode('utf-8')
>>> f.write('\t$$%r$$other_data\n'%a)
>>> f.write('\t$$%s$$other_data\n'%a)
>>> f.close

Wyniki są:

    $$'\xe7\xab\xaf\xe5\xba\x84\xe7\x9a\x84\xe9\xa9\xac\xe6\xad\x87\xe5\xb0\x94'$$other_data
    $$端庄的马歇尔$$other_data

Przygotujmy się Ta odpowiedź w odniesieniu do różnicy między% R i% s.

Mam nadzieję, że to pomogło.

1
Community 23 maj 2017, 12:02

Pliki są bajty . Nie możesz przechowywać w nich znaków.

Szczególnie częstym kodowaniem jest ASCII. To kodowanie, podobnie jak wszystkie te różne teczki Unicode.

Bajty są niezależne (jako tekst) samodzielnie bez związanego z kodowaniem, aby dać im znaczenie.

Musisz wyświetlić plik z edytorem lub przeglądarką, który używa tego samego kodowania, który użyłeś do zapisu pliku.

1
John La Rooy 12 sierpień 2014, 09:59

Odkąd masz bajtów, musisz znać swoje kodowanie. Istnieje wiele sposobów, aby obrócić bajty do Unicode ({x0}}) i jest w zależności od kodowania bajtów.

Nie możesz tego dostać z samych bajtów , ktoś musi ci powiedzieć kodowanie.

Chociaż czasami możesz dokonać wykształcenia:

>>> import chardet
>>> s = '\xe7\x8e\xa9'
>>> chardet.detect(s)
{'confidence': 0.505, 'encoding': 'utf-8'}
>>> s.decode(chardet.detect(s)['encoding'])
u'\u73a9'
>>> print _
玩

Teraz powinieneś przekonwertować dowolne struny z DB do Unicode, gdy tylko wejdą do programu Pythona, aby Twój kod pracuje całkowicie w Unicode, a nie bajtów.

Następnie możesz napisać plik w ten sposób:

import io
with io.open('/tmp/myfile.txt', 'wb', encoding='utf-8') as f:
    f.write(u'\u73a9')
    f.write('\n')
    f.write('random other data 12345...')
1
wim 3 kwiecień 2017, 19:12