2012-05-23 16 views
8

Próbuję wypisać do pliku płaskiego niektóre chińskie lub rosyjskie lub różne zestawy znaków nieangielskich do celów testowych. Utknąłem na temat wyprowadzania wartości szesnastkowo-dziesiętnej w systemie Unicode do odpowiadającej jej postaci.Python unicode codepoint do znaku Unicode

Na przykład w języku Python, jeśli miałeś zakodowany zestaw znaków, takich jak абвгдежзийкл, mógłbyś przypisać value = u"абвгдежзийкл" i nie ma problemu.

Jeśli jednak był zapisany w zmiennej jeden dziesiętny lub szesnastkowo dziesiętny jak 1081/0439, a chciałbyś wydrukować to z odpowiadającym mu faktycznym charakterem (a nie tylko wyjściowym 0x439), w jaki sposób by to zrobić? Powyższa wartość dziesiętna/heksadecymalna Unicode odnosi się do й.

+0

Może zajść potrzeba zmiany tytułu pytanie. Wspomina o UTF-8, ale pytanie nie ma nic wspólnego z UTF-8. – NPE

+2

Twoja stała wzmianka o "dziesiętnym lub szesnastkowym" oznacza, że ​​jesteś w nieświadomości faktu, że "dziesiętny lub szesnastkowy" to tylko kwestia reprezentacji, a nie własność samej wartości. – glglgl

Odpowiedz

17

Zastosowanie unichr() (Python 2) lub chr() (Python 3):

In [4]: print(unichr(1081)) 
Out[4]: й 
+0

Dziękuję za odpowiedź, chociaż nie jest to tym, czego szukam, ponieważ już wiem, jak obsługiwać zakodowane wpisy. Chcę wiedzieć, jak obsługiwać dziesiętne lub szesnastkowe wartości unikodowe w zmiennej dla standardowego wyjścia lub wyjścia do pliku. – stoneferry

+0

@stoneferry: Wystarczy zmienić "1081" na nazwę zmiennej, która zawiera kod postaci. – NPE

+0

Jeśli mam zmienną, która zawiera tylko liczbę całkowitą "1081", jak na przykład użyć polecenia print, aby wypisać znak, a nie jsut '1081'. – stoneferry

1

Więc odpowiedź na pytanie brzmi:

  1. konwersji wartości szesnastkowej na dziesiętną z int(hex_value, 16)
  2. następnie pobierz odpowiedni pas z chr().

Podsumowując:

>>> print(chr(int('0x897F', 16))) 
西 
0

Jeśli napotkasz błąd:

ValueError: unichr() arg not in range(0x10000) (narrow Python build)

Starając się zamienić wartość hex korzystając unichr można obejść tego błędu wykonując coś na przykład:

>>> n = int('0001f600', 16) 
>>> s = '\\U{:0>8X}'.format(n) 
>>> s 
'\\U0001F600' 
>>> binary = s.decode('unicode-escape') 
>>> print(binary)