[python] unicode

Pavel Reznicek pavel.jindrich na tiscali.cz
Neděle Říjen 30 15:42:19 CET 2005


> geon napsal(a):
> 
>> Martin Blazik napsal(a):
>>
>>> Cau,
>>> jakym zpusobem muzu prevest unicode string do bytove reprezentace 
>>> (retezcove podoby) tak, abych data mohl ulozit do souboru (rekneme v 
>>> notaci little endian)?
>>> Tu prevodni funkci si dokazu napsat sam na par radek, spis by me 
>>> zajimalo, jestli uz neexistuje v pythonu nejaky standartni nastroj. 
>>> Zkousel jsem najit nejaky default konvertor 
>>> (http://python.org/doc/2.4.2/lib/standard-encodings.html#standard-encodings), 
>>> ale taky nic nebo ho jen nevidim :)
>>>
>>>  
>>>
>> tutorial:
>>
>> To convert a Unicode string into an 8-bit string using a specific 
>> encoding, Unicode objects provide an encode() method that takes one 
>> argument, the name of the encoding. Lowercase names for encodings are 
>> preferred.
>>
>>>>> u"äöü".encode('utf-8')
>>>>
>>>>
>> '\xc3\xa4\xc3\xb6\xc3\xbc'
>>
>>
>> je to ono?
>>

Martin Blazik napsal(a):
 > No neni, UTF-8 uklada kazdy znak do promenne delky (1 az 3 znaky
 > myslim). Ja chci aby se kazdy znak prelozil presne na dva bajty
 > (potrebuju aby z dat sla primo poznat delka retezce).
 > Takze u'\uFEFFAhoj' => '\xff\xfe\x41\x00\x68\x00\x6f\x00\x6a\x00'
 >
 > lachtan

Kódování utf-16le (low-endian) nebo utf-16be (big-endian) by snad mohlo 
odpovídat Vašim potřebám. Obě kódují každý znak pravidelně po dvou 
bytech (16 bitů). Low-endian se typicky používá na počítačích s 
procesory řady PC x86; big-endian je doma především na Motorolách 
(tuším, že se také značí 68x; typicky Apple MacIntosh). Jde o rozdíl v 
interním pořadí byteů při representaci číselných hodnot: Motorola začíná 
vyššími číselnými řády (jako při psaní našich číslic), x86 začíná 
nižšími (takže obráceně); toto pořadí se pak odráží i v kódování 
Unikódu. Záleží na Vás, který způsob si vyberete, ale pro PC (budete-li 
chtít výsledek číst něčím jiným, než Pythonem) je rozhodně výhodnější 
kódovat stylem low-endian.
Také existují 32-bitová kódování, ale s těmi zatím nemám zkušenosti. 
Také zabírají zase dvakrát tolik místa a existují hlavně kvůli nové 
indexové oblasti Unikódu nad 0xffff.
Takové znaky však nejspíše
nikdo z nás každý den nepíše.

 >>> s=u"Ještě"
 >>> s.encode('utf-16le')
'J\x00e\x00a\x01t\x00\x1b\x01'
 >>> s.encode('utf-16be')
'\x00J\x00e\x01a\x00t\x01\x1b'

Pavel



Další informace o konferenci Python