2012-09-08 2 views
0

en python:que diable le numéro unicode est?

>>> "\xc4\xe3".decode("gbk").encode("utf-8") 
'\xe4\xbd\xa0' 
>>> "\xc4\xe3".decode("gbk") 
u'\u4f60' 

nous pouvons obtenir deux conclusions:

1. \ XC4 \ xe3 dans encode GBK = \ XE4 \ XBD \ xa0 en utf-8
2. \ XC4 \ xe3 dans encode gbk = \ X4F \ x60 dans unicode (ou dire dans UCS-2)

dans R:

> iconv("\xc4\xe3",from="gbk",to="utf-8",toRaw=TRUE) 
[[1]] 
[1] e4 bd a0 
> iconv("\xc4\xe3",from="gbk",to="unicode",toRaw=TRUE) 
[[1]] 
[1] ff fe 60 4f 

maintenant, le conclusion1 est correct, il est aussi à même python comme dans R
conclusion2 est un puzzle,
ce qui sur terre est le \ xc4 \ xe3 dans gbk encoder = ?? en unicode.
en python c'est u '\ u4f60', en R c'est ff fe 60 4f
sont l'égalité? lequel est correct? sont-ils tous corrects?

+9

[Le minimum absolu que tout développeur de logiciels doit absolument, positivement savoir sur Unicode et jeux de caractères (pas d'excuses!)] (Http://www.joelonsoftware.com/articles/Unicode.html) – delnan

+0

[Unicode dans Wikipedia] (http://en.wikipedia.org/wiki/Unicode): * "Unicode peut être implémenté par différents encodages de caractères Les encodages les plus couramment utilisés sont UTF-8, UTF-16 et le désormais obsolète ... . "* –

+0

Cet article wikipedia traite de l'encodage GBK. http://en.wikipedia.org/wiki/GBK Cet article décrit Unicode en python http://docs.python.org/howto/unicode.html –

Répondre

6

En notation python, la notation \uxxxx fait référence aux points de code Unicode, et non à codant de ces points de code.

UCS-2, UTF-16, UTF-8 sont tous les encodages capables de capturer les points de code en octets appropriés pour le stockage dans des fichiers, pour transférer sur un réseau, etc.

la représentation R du \u4f60 codet inclut l'UTF-16 Byte Order Mark ou BOM. Il indique quel ordre d'octets est choisi, où 0xFFFE signifie peu endian. Python comprend aussi, lorsque vous encodez en UTF-16:

>>> u'\uf460'.encode('utf16') 
'\xff\xfe`\xf4' 

L'équivalent big-endian est 0xFEFF. Vous pouvez coder explicitement utf-16be ou utf-16le en python pour éviter la nomenclature étant inclus, parce que vous avez fait un choix explicite:

>>> u'\uf460'.encode('utf-16be') 
'\xf4`' 
>>> u'\uf460'.encode('utf-16le') 
'`\xf4' 

Vous devriez vraiment lire l'article Joel Spolsky Unicode, ainsi que le Python Unicode HOWTO à apprécier plus pleinement la différence entre Unicode et les encodages.

Questions connexes