Qual é o prefixo u em uma string Python?


232

Como em:

u'Hello'

Meu palpite é que indica "Unicode", está correto?

Se sim, desde quando está disponível?

Respostas:


147

Você está certo, veja 3.1.3. Strings Unicode .

Essa é a sintaxe desde o Python 2.0.

O Python 3 os tornou redundantes, pois o tipo de string padrão é Unicode. As versões 3.0 a 3.2 os removeram, mas foram adicionados novamente no 3.3+ para compatibilidade com o Python 2 para ajudar na transição de 2 para 3.


6
Deve-se acrescentar que não é mais necessário no Python 3, mas ainda é uma sintaxe válida.
Martin Thoma

A combinação de strings unicode + raw (regex) (por exemplo ur"string") é válida no Python 2, mas infelizmente é uma sintaxe inválida no Python 3.
cowlinator

123

U u'Some String'significa que sua sequência é uma sequência Unicode .

P: Estou com muita pressa e cheguei aqui da Pesquisa do Google. Estou tentando gravar esses dados em um arquivo, estou recebendo um erro e preciso da solução mais simples, provavelmente com defeito, neste segundo.

R: Você realmente deve ler o ensaio do Absoluto Mínimo Absoluto de Joel, Todo desenvolvedor de software, absolutamente, deve saber positivamente sobre Unicode e conjuntos de caracteres (sem desculpas!) Sobre conjuntos de caracteres.

Q: sry nenhum código de tempo pls

Uma multa. tente str('Some String')ou 'Some String'.encode('ascii', 'ignore'). Mas você realmente deve ler algumas das respostas e discussões sobre a conversão de uma string Unicode e este excelente, excelente, primer sobre codificação de caracteres.


6
Isso funciona se a string contiver apenas texto ASCII . Em todos os outros casos, você precisará codificar explicitamente.
Martijn Pieters

2
Isso trata você como algo "para se livrar". Isso me diz que você realmente não entende o que é. Geralmente, você não quer apenas "se livrar dele", e a maneira correta de criar uma sequência de bytes a partir de uma sequência Unicode depende do que ela contém e em que contexto.
Lennart Regebro

2
A @LennartRegebro concordou totalmente - essa era uma resposta descartável que deveria ser uma brincadeira, mas acumulou uma espécie de número horrível de votos positivos. editado para tentar orientar as pessoas na direção certa.
5303 Andrew

1
Foi uma leitura divertida! Obrigado! O artigo tem 17 anos e ainda é preciso. Uau.
Kerwin Sneijders

52

Meu palpite é que indica "Unicode", está correto?

Sim.

Se sim, desde quando está disponível?

Python 2.x.

No Python 3.x, as strings usam Unicode por padrão e não há necessidade do uprefixo. Nota: no Python 3.0-3.2, u é um erro de sintaxe. No Python 3.3 ou superior, é legal novamente facilitar a criação de 2/3 de aplicativos compatíveis.


4
É até um erro de sintaxe no Python 3 usar o uprefixo.
Tim Pietzcker

14
@ TimPietzcker: apenas em 3.0-3.2; no 3.3+, é legal (e sem sentido) facilitar a gravação de aplicativos e bibliotecas 2.6 + / 3.3 + de base de código único.
abarnert

@abarnert: Bem, esse comentário é agora quatro-e-um-metade anos :)
Tim Pietzcker

3
@ TimPietzcker: Claro, mas assim como seu comentário foi um adendo útil para qualquer pessoa que encontrar essa resposta útil pela pesquisa em 2010, acho útil mencionar a alteração na versão 3.3 para qualquer pessoa que a encontre em 2014. Talvez seja melhor editar o resposta, mas acho que é um ponto menor que a maioria das pessoas não encontra (porque a menos que você ainda esteja usando o 3.0-3.2 em 2014, "não é necessário o prefixo" é tudo o que você precisa saber).
abarnert

Se você está escrevendo um código para usuários arbitrários baixarem e executarem, e deseja cobrir os casos mais possíveis sem fazer suposições, é útil saber que o 3.0-3.2 será interrompido. Porque você precisa decidir se deseja usar em six.text_type()qualquer lugar para o número (espero que minúsculo) de pessoas que ainda usam 3. [012] - pelo menos as informações estão lá para que você possa escolher.
precisa saber é o seguinte

3

Eu vim aqui porque tinha síndrome de char engraçado na minha requestsprodução. eu penseiresponse.text que me daria uma string decodificada corretamente, mas na saída encontrei caracteres duplos engraçados onde os tremados alemães deveriam estar.

Acontece que response.encodingestava vazio de alguma forma e assimresponse , não sabia como decodificar adequadamente o conteúdo e apenas o tratou como ASCII (eu acho).

Minha solução foi obter os bytes brutos com 'response.content' e aplicar manualmente decode('utf_8')a ele. O resultado foi schöne Umlaute.

O decodificado corretamente

pele

vs. descodificado incorretamente

para


2

Todas as strings destinadas a humanos devem usar "" u.

Eu descobri que a seguinte mentalidade ajuda muito ao lidar com seqüências de caracteres Python: Todas as seqüências de manifesto do Python devem usar a u""sintaxe. A ""sintaxe é apenas para matrizes de bytes.

Antes de começar o golpe, deixe-me explicar. A maioria dos programas Python começa com o uso ""de strings. Porém, eles precisam dar suporte à documentação fora da Internet, para que comecem a usar "".decodee, de repente, estão recebendo exceções em toda parte sobre a decodificação disso e daquilo - tudo por causa do uso de"" para strings. Nesse caso, o Unicode age como um vírus e causará estragos.

Mas, se você seguir minha regra, não terá essa infecção (porque você já estará infectado).


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
Kennytm 17/03/10

@KennyTM Parece bom! Simplesmente quis dizer que todas as cordas destinadas aos seres humanos deveriam usar u"".
Frank Krueger

1
Se você deseja usar religiosamente o Unicode em qualquer lugar - o que, para muitos aplicativos (mas não todos), é uma coisa boa - você quase certamente deseja o Python 3.x, não o 2.x. Isso pode não ter sido verdade em 2010, quando isto foi escrito, mas em 2014, a maioria das bibliotecas ou plataformas que o impedem de fazer o upgrade para 3.x também irá impedi-lo de usar Unicode corretamente ...
abarnert

1

É Unicode.

Basta colocar a variável entre str() e ela funcionará bem.

Mas no caso de você ter duas listas como a seguinte:

a = ['co32','co36']
b = [u'co32',u'co36']

Se você marcar set(a)==set(b), ele será falso, mas se você fizer o seguinte:

b = str(b)
set(a)==set(b)

Agora, o resultado será verdadeiro.


Perigo, perigo. Você nunca deve codificar um Unicode ( str()ou u'€'.encode()) sem passar uma codificação. Se a string contiver não ASCII, o usuário receberá uma UnicodeEncodeException.
Alastair McCormack

3
Além disso, seu código não funciona. b = str(b)apenas fornece a sequência repr()da lista, ie b = "[u'co32', u'co36']". Entãoset(a)==set(b) = False
Alastair McCormack
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.