Pergunta

Tropecei nesta passagem no Tutorial Django:

Os modelos do Django têm um padrão str() método que chama Unicode() e converte o resultado em uma bytestring UTF-8.Isso significa que unicode(p) retornará uma string Unicode e str(p) retornará uma string normal, com caracteres codificados como UTF-8.

Agora, estou confuso porque afaik Unicode não é uma representação específica, então o que é uma "string Unicode" em Python?Isso significa UCS-2?Pesquisando no Google apareceu este "Tutorial Python Unicode" que corajosamente afirma

Unicode é uma codificação de dois bytes que cobre todos os sistemas de escrita comuns do mundo.

o que é totalmente errado, ou é?Fiquei confuso muitas vezes com problemas de conjunto de caracteres e codificação, mas aqui tenho certeza de que a documentação que estou lendo está confusa.Alguém sabe o que está acontecendo no Python quando ele me fornece uma "string Unicode"?

Foi útil?

Solução

o que é uma "string Unicode" em Python?Isso significa UCS-2?

Strings Unicode em Python são armazenadas internamente como UCS-2 (representação de comprimento fixo de 16 bits, quase igual a UTF-16) ou UCS-4/UTF-32 (representação de comprimento fixo de 32 bits).É uma opção em tempo de compilação;no Windows é sempre UTF-16, enquanto muitas distribuições Linux definem UTF-32 (“modo amplo”) para suas versões do Python.

Geralmente, você não deve se importar:você verá pontos de código Unicode como elementos únicos em suas strings e não saberá se eles estão armazenados como dois ou quatro bytes.Se você estiver em uma compilação UTF-16 e precisar lidar com caracteres fora do plano multilíngue básico, você estará fazendo errado, mas isso ainda é muito raro, e os usuários que realmente precisam de caracteres extras devem compilar compilações amplas.

completamente errado, ou é?

Sim, está completamente errado.Para ser justo, acho que esse tutorial é bastante antigo;provavelmente é anterior a strings Unicode largas, se não ao Unicode 3.1 (a versão que introduziu caracteres fora do plano multilíngue básico).

Há uma fonte adicional de confusão decorrente do hábito do Windows de usar o termo “Unicode” para significar, especificamente, a codificação UTF-16LE que o NT usa internamente.As pessoas da Microsoftlândia muitas vezes copiam esse hábito um tanto enganoso.

Outras dicas

Enquanto isso, fiz uma pesquisa apurada para verificar qual é a representação interna em Python, e também quais são seus limites."A verdade sobre Unicode em Python"é um artigo muito bom que cita diretamente dos desenvolvedores Python.Aparentemente, a representação interna é UCS-2 ou UCS-4, dependendo de uma opção em tempo de compilação.Então Jon, não é UTF-16, mas sua resposta me colocou no caminho certo de qualquer maneira, obrigado.

Python armazena Unicode como UTF-16.str() retornará a representação UTF-8 da string UTF-16.

De Wikipédia em UTF-8:

UTF-8 (formato de transformação UCS/Unicode de 8 bits) é um codificação de caracteres de comprimento variável para Unicode.É capaz de representar qualquer caractere no padrão Unicode, ainda assim, a codificação inicial de códigos de bytes e atribuições de caracteres para UTF-8 é compatível com versões anteriores de ASCII.Por essas razões, ela está se tornando cada vez mais a codificação preferida para e-mails, páginas da Web[1] e outros locais onde caracteres são armazenados ou transmitidos.

Portanto, está entre um e quatro bytes, dependendo de qual caractere você deseja representar no domínio Unicode.

Da Wikipedia em Unicode:

Na computação, Unicode é um padrão da indústria que permite aos computadores representar e manipular consistentemente texto expresso em a maioria dos sistemas de escrita do mundo.

Portanto, é capaz de representar a maioria (mas não todos) dos sistemas de escrita do mundo.

Eu espero que isso ajude :)

Então, o que é uma "string unicode" no Python?

Python 'sabe' que sua string é Unicode.Portanto, se você fizer regex nele, ele saberá qual é personagem e qual não é, etc., o que é realmente útil.Se você fez um strlen também dará o resultado correto.Por exemplo, se você contou strings em Hello, obterá 5 (mesmo que seja Unicode).Mas se você fez uma contagem de string de uma palavra estrangeira e essa string não era uma string Unicode, você terá um resultado muito maior.Pythong usa as informações do banco de dados de caracteres Unicode para identificar cada caractere na string Unicode.Espero que ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top