[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