Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 11, 2014 19:25:05

George_pryanik
Зарегистрирован: 2014-10-26
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

кодировки

Добрый вечер буду крайне признателен если кто объяснит как выбрать кодировку например
#1251 откуда она берется зависит ли от версии как её поменять
какие для кирилицы… зачем нужны кодировки..

Офлайн

#2 Дек. 11, 2014 20:26:04

vax
Зарегистрирован: 2014-12-05
Сообщения: 10
Репутация: +  1  -
Профиль   Отправить e-mail  

кодировки

Попробую ответить:
Кодировка - условно таблица, в одной колонке которой число, в другой - графическое отображение. По ней программа определяет, как вывести текст (ведь все данные хранятся в виде байта, заполненного 0 и 1. - как их отображать и воспринимать решает программист и иногда пользователь).

Unicode, UTF-8, Windows-1251, cp1251 могут хранить кириллицу. Причём все юникодные будут использовать 2 и более байта на символ (но подходят для люыбых текстов), 1251-ые - один (зато только кириллица).

В Python по умолчанию есть встроенная кодировка (В Python 3 - Unicode, для 2 - были строки ASCII и Unicode). Чтобы текст вывести функцией print, вначале надо привести данные к кодировке по умолчанию.

Примеры для Python 3, но отличия в версиях на сколько помню, тут минимальны:
Преврать строку из кодировки по умолчанию в иную кодировку можно с помощью ф-ции encode

s = "Привет"
new_s = s.encode("windows-1251")
type(new_s)#builtins.bytes 
Теперь для интерпретатора строка - просто массив байт. (При сравнении, замене и т.п. важно проверить, чтобы типы строк совпадали)

Превратить из массива байтов (или похожего типа) данные в строку можно с помощью ф-ции decode, которую можно отобразить пользователю:
s = b'\xcf\xf0\xe8\xe2\xe5\xf2'
new_s = s.decode("windows-1251")
print(new_s)

Открыть файл:
#Python 2
import io
with io.open("C:\\Users\\myfile.txt", "r", encoding="windows-1251") as myfile:
    print myfile.read()

#Python 3
with open("C:\\Users\\myfile.txt", "r", encoding="windows-1251") as myfile:
    print(myfile.read())

Посмотрите презентацию:
Your text to link here…



Python 3.4 Lover:)

Отредактировано vax (Дек. 11, 2014 20:30:06)

Офлайн

#3 Дек. 12, 2014 00:31:28

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

кодировки

vax
Попробую ответить:
хорошая попытка, но не совсем удачная.
Судя по тексту вы понимаете Unicode как кодировку, что ошибочно. Unicode в Питоне это объект:
The items of a Unicode object are Unicode code units. A Unicode code unit is represented by a Unicode object of one item and can hold either a 16-bit or 32-bit value representing a Unicode ordinal (the maximum value for the ordinal is given in sys.maxunicode, and depends on how Python is configured at compile time)
А это очень важно. Тем более нужно понимать отличия объекта Unicode и текста кодированным по стандарту Юникод.

George_pryanik
У вас есть файл с исходным кодом на языке программирования Python. Как и любой другой текстовой файл он имеет возможность представления разными кодировками. Рекомендуется повсеместно использовать UTF-8 кодировку. Интерпретатор Python способен обрабатывать файлы с исходным кодом кодированными разными кодировками, но при этом, что бы он корректно работал нужно указать ему правильную кодировку. Поэтому :
1) исходный файл кодируется в utf-8, кодировать его можно посредством вашего редактора исходного кода, для Windows есть великолепный Notepad++.
2) в начале файла с исходным кодом указывается строка указывающая интерпретатору в какая кодировка используется для текущего файла. Строка может выглядеть по разному, например так:
# -*- coding: utf-8 -*-

Многие ваши вопросы решаться здесь (ну и в Гугле, уж что то ,а об этом написана тонна инфы):
https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2
https://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4#.D0.A1.D0.BF.D0.BE.D1.81.D0.BE.D0.B1.D1.8B_.D0.BF.D1.80.D0.B5.D0.B4.D1.81.D1.82.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Дек. 12, 2014 02:12:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

кодировки

dip3. strings

Вкратце:
Есть юникод - стандарт, описывающий числа по порядку от нуля до чуть больше миллиона, часть из которых обозначает символы. В юникоде помещаются все символы всех народов, которые были и есть, и есть ещё много места для будущих символов. Там есть и смайлики всякие, что говорит о любых символах, а не только языковых.

Для юникода есть несколько кодировок - utf-8, utf-16, utf-32, - которые переводят числа юникода в байтовые последовательности. Байтовые последовательности уже используются для передачи (на экран) и хранения (в файлах).

Но юникод появился не сразу, а, можно сказать, недавно, поэтому до него эти функции выполняли другие средства. Поэтому существует как бы пропасть между одним и тем же: utf-8 может кодировать иероглифы, cp1251 не может кодировать иероглифы.



Отредактировано py.user.next (Дек. 12, 2014 02:17:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version