【问题标题】:What's the difference of u'somestring' and unicode('somestring'), python 2.7u'somestring' 和 unicode('somestring') 有什么区别,python 2.7
【发布时间】:2015-06-21 19:03:04
【问题描述】:

当我将 python 字符串与 Django model.CharField 连接时,我得到了 'UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 14: ordinal not in range(128)':

some_variable = unicode("jotain älähti") + self.some_charfield

在我切换到这个之后:

some_variable = u"jotain älähti" + self.some_charfield

它不再引发错误。 u和python中的unicode函数有什么区别?我正在使用 python 2.7.5 和 Django 1.7.1 为什么它不再引发错误?

我不知道为什么它必须首先解码。解码不是从字节形成人类可读的字母和单词的过程吗?如果我需要打印它,我会理解这种情况下的解码,但我从未打印过它。解码是否与连接过程有关?那为了让程序连接,它需要解码这两个字符串,然后才能进行连接,然后将它们编码为字节?我在文件开头输入了这样的编码方法:# -- coding: utf-8 --

【问题讨论】:

  • 你需要指定编码unicode("jotain älähti",encoding="utf8"),unicode正在尝试解码为ascii。
  • @MalikBrahimi 他们不一样。 unicode() 自己接受一个 ASCII 字符串并将其转换为 unicode 字符串(以 u 为前缀)。这就是 OP 收到错误的原因。在第二个示例中,OP 在字符串前添加了u,使其成为 unicode 文字,因此没有错误。
  • 谢谢,我想我明白了! :)

标签: python django unicode character-encoding decoding


【解决方案1】:

u"ä" 是一个 Unicode 文本 -- 一个 Unicode 代码点序列。根据字符编码,它可能对应于不同的字节序列:

>>> u"ä".encode('utf-8')
'\xc3\xa4'
>>> u"ä".encode('cp1252')
'\xe4'
>>> u"ä".encode('utf-16le')
'\xe4\x00'

编码声明# -*- coding: utf-8 -*- 指定您的源代码编码。它只是确保 b"ä" 字节串文字被解释为 b'\xc3\xa4' 字节序列。

源代码的编码与运行时使用的编码无关。

unicode(bytestring) 在这里等同于bytestring.decode('ascii')

>>> b'\xc3\xa4'.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

字节串中的非 ascii 文字字符(例如 b"ä")在 Python 3 中已被弃用,unicode 类型在那里被称为 str。您可以在顶部添加 from __future__ import unicode_literals 以将 "ä" 解释为 Python 2 和 3 上的 Unicode 文本。

【讨论】:

    猜你喜欢
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2011-04-26
    • 2014-11-28
    • 2013-01-11
    • 2015-01-25
    相关资源
    最近更新 更多