【问题标题】:Encoding in python 2.7, from IDE to stringpython 2.7中的编码,从IDE到字符串
【发布时间】:2015-09-15 19:29:46
【问题描述】:

所以我在这里,我整天都在阅读有关编码的信息,现在我需要澄清一下。

首先我将 eclipse mars 与 pydev 一起使用。

Unicode 是一个(字符集+代码点),基本上是一个与数值相关的符号表。 这些值以二进制级别存储的方式由编码定义,比如说 UTF-8。

1 : shebang

shebang 有什么用?当我输入# -*- coding: utf-8 -*- 时,它有什么作用吗?还是它只是表明我的文件是用 UTF-8 编码的(但因为它只是表明它可能是一个谎言:o)

2 : Eclipse file encoding

写完shebang并保存后,我进入文件的属性,它说编码:ISO-8859-1,所以我的猜测是shebang除了指示我的文件是哪种编码之外什么都不做。 我需要手动将每个文件设置为 UTF-8,还是有办法教 eclipse 读取 shebang 并采取相应措施。

3 : Why does the shebang only specify the encoding?

我的 shebang 说 utf-8,好吧,那又怎样?它没有告诉我使用了哪个字符集。 由于 UTF-8 只是一种编码,我可以将 UTF-8 与任何字符集一起使用吗? 如果我愿意,我可以用 UTF-8 编码 ASCII,因为编码只是转换和存储/读取代码点的一种方式。 如果我用 utf-8 编码的字符集没有与 unicode 相同的代码点怎么办? (这可能吗?)

4 : maybe a solution?

我经常读到 utf-8 是 unicode 的实现,那是不是每次读 encoding = UTF-8 你可以是 100%,我说是 100%,确定字符集+码位是 unicode ?

我迷路了

【问题讨论】:

  • 脚本描述行添加不是答案。模块之间的编码是未定义的。 Python 自动获取当前系统的编码。您的系统必须采用 utf-8 编码。将您的 os 参数设置为 utf-8 编码系统。 Python 每次运行时都从本地编码中获取信息。如果您想使用 UTF-8,Unicode 对您没有任何好处。
  • 请将您的问题限制为每个问题一个问题

标签: python python-2.7 unicode encoding utf-8


【解决方案1】:

您的问题存在多种误解。

Unicode is a standard 通常用于处理文本。它不是“字符集+代码点”,例如,Unicode 标准定义了how to find word boundarieshow to compare Unicode string

# -*- coding: utf-8 -*- 是一个编码声明。这不是一个shebang。 Shebang(顾名思义)以#! 开头,例如#! /usr/bin/env python

如果您的 Python 源代码中有非 ascii literal 字符,您可能需要编码声明,例如,如果您编写以下代码,则不需要编码声明:

#!/usr/bin/env python2
print u"\N{SNOWMAN}"

但如果你使用 literal 非 ascii 字符,则需要它:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
print u"☃"

如果第二个脚本使用 utf-8 编码保存,则两个脚本产生相同的输出。编码声明说明了如何解释构成 Python 源代码的字节以获取程序文本。

“有没有办法教 eclipse 阅读 shebang 编码声明并采取相应的行动。” 是一个很好的单独 问题。如果 IDE 有明确的 Python 支持,那么它应该会自动支持。

我的 shebang 编码声明说 utf-8,好吧,那又怎样?它没有告诉我使用了哪个字符集。

“字符编码”、代码页和字符集在许多情况下可以互换使用。请参阅What's the difference between encoding and charset? 这些区别与在 Python 中从字节转换为文本并返回的任务无关:

unicode_text = bytestring.decode(character_encoding)
bytestring = unicode_text.encode(character_encoding)

字节串是 Python 中不可变的字节序列(粗略地说是0..255 范围内的数字),用于表示任意二进制数据,例如图像、zip 存档、加密数据和使用某种字符编码编码的文本。 Unicode 字符串是不可变的 Unicode 代码点序列(粗略地说,0..sys.maxunicode 范围内的数字),用于在 Python 中表示文本。

某些字符编码(例如 cp437)仅支持少数 Unicode 字符。其他如utf-8 支持全范围的Unicode 代码点。

【讨论】:

    【解决方案2】:

    添加编码声明的正确方法是># -*- coding: utf-8 -*- 它告诉python将当前脚本中的编码更改为UTF-8它与用户无关。

    【讨论】:

    • 这就是我的意思,我的问题写得太快了(我会编辑)。所以 python 解释器会将脚本读取为 utf-8,所以我必须在我的 IDE 属性中设置 utf-8,否则 python 会尝试在其他编码的文件中读取 utf-8
    【解决方案3】:

    好吧,我想我找到了解决所有这些问题的方法

    1/ 感谢 J.Dev,shebang 只告诉 python 解释器文件的编码内容,但必须用你放入 shebang 的内容对文件进行编码

    2/ 显然我必须手动完成

    3/ 因为编码与字符集相关联,如果您说 encoding=utf-8 那么它将始终是 unicode 字符集

    一些旧的 1 字节字符集没有编码,你不需要编码,因为 char 都存储在 1 字节上,自然的二进制翻译就是编码。

    因此,例如,当您说 ASCII 时,您的意思是字符集和编码 = ASCII

    但这让我想知道,是否还有其他类型的字符集具有多种编码实现(如 unicode 可以编码为 utf-8/16/32)

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多