Определите слово, которое закодировано в кодировке Windows-1251, а прочитано в КОИ-8.
ограничьте количество одновременно выпускаемых пушкой снарядов не более трёх штук помогите пожалуйста это задача по программированию в python через Tk … inter. напишете программу пожалуйста.
Из питона в С++! срочно до конца дня! и только на с++!! n, k = map(int, input().split()) *a, = map(int, input().split()) a.sort() left = 0 right = a[- … 1] — a[0] + 1 while left < right: mid = (left + right)//2 cows = 1 last = a[0] for cur in a[1:]: if cur — last > mid: cows += 1 last = cur if cows >= k: left = mid+1 else: right = mid print(left)
как рашифровается слово ТУРНЕ по информатике
Строка с максимальной суммой элементов.Программирование c++ В заданном двумерном массиве целых чисел A требуется найти и вывести индекс строки, сумма … элементов которой максимальна. Input Со стандартного устройства ввода в первой строке вводятся 2 целых числа M и N — соответственно количество строк и столбцов двумерного массива A: 1<=M<=100, 1<=N<=100. В следующих M строках вводятся ровно по N элементов, являющихся элементами двумерного массива A. Все значения в массиве от -100 до 100. Output Требуется вывести индекс строки, сумма элементов которой максимальна. Выводить пробел в конце не нужно. Sample Input 3 3 1 2 3 4 5 6 7 8 9 Sample Output 2
Строка с максимальной суммой элементов.С++ В заданном двумерном массиве целых чисел A требуется найти и вывести индекс строки, сумма элементов которой … максимальна. Input Со стандартного устройства ввода в первой строке вводятся 2 целых числа M и N — соответственно количество строк и столбцов двумерного массива A: 1<=M<=100, 1<=N<=100. В следующих M строках вводятся ровно по N элементов, являющихся элементами двумерного массива A. Все значения в массиве от -100 до 100. Output Требуется вывести индекс строки, сумма элементов которой максимальна. Выводить пробел в конце не нужно. Sample Input 3 3 1 2 3 4 5 6 7 8 9 Sample Output 2
C++!! Левый и правый двоичный поискДано два списка чисел, числа в первом списке упорядочены по неубыванию. Для каждого числа из второго списка определ … ите номер первого и последнего появления этого числа в первом списке. В данной задаче можно пользоваться встроенными функциями.Входные данныеВ первой строке входных данных записаны два числа N и M (1≤N,M≤20000). Во второй строке записаны N упорядоченных по неубыванию целых чисел — элементы первого списка. В третьей строке записаны M целых неотрицательных чисел — элементы второго списка. Все числа в списках — целые 32-битные знаковые.Выходные данныеПрограмма должна вывести M строчек. Для каждого числа из второго списка нужно вывести номер его первого и последнего вхождения в первый список. Нумерация начинается с единицы. Если число не входит в первый список, нужно вывести одно число 0.ПримерыВвод10 51 1 3 3 5 7 9 18 18 5757 3 9 1 17910 10Вывод3 47 71 20Можно этот код переделать в С++!s1 = input()s2 = input()s3 = input()A = set(map(int, s2.split()))B = list(map(int, s3.split()))for b in B:~~~~if b in A:~~~~~~~~print(‘YES’)~~~~else:~~~~~~~~print(‘NO’)Только чтоб работал!
C++!! Upper boundНа вход подаются N целых чисел, а также набор из M запросов, каждый из которых — целое число.9.Выходные данныеВыведите единственную строку с M целыми числами — количествами чисел исходного массива, меньших либо равных соответствующему запросу.ПримерыВвод51 5 3 2 124 3Вывод4 4ОграниченияВремя выполнения: 3 секунды
30 балов! Срочно! =============================== #pgzero WIDTH = 300 # Ширина окна HEIGHT = 300 # Высота окна TITLE = «Призрак в замке» # Заголовок о … кна игры FPS = 30 # Количество кадров в секунду # Объекты ghost = Actor(‘ghost’, (150, 150)) fon = Actor(«bg») def draw(): fon.draw() ghost.draw() ======================================================== Создайте еще одну собственную мини-игру! Напишите код управления приведением в замке по стрелкам: влево, вправо, вверх, вниз. А для того, чтобы получилось еще интереснее напишите код изменения скина при нажатии на пробел — эту проверку лучше прописать в функции on_key_down(key): если кнопка нажата и сейчас скин ghost, то он меняется на ghost1, иначе, если нажат пробел и сейчас скин ghost1, то он меняется на ghost. Не забудьте написать проверку на то, что призрак не уйдет за границы окна игры!
ПОМОГИТЕ, ПОЖАЛУЙСТААА!!!!вот ввожу и никак не могу получить ответ, ЧТО БДУЕТ ВЫВВЕДЕНО НА ЭКРАН ПОСЛЕ ЭТОЙ ПРОГРАММЫ. у пеня выходит ошибка, ответ не … принимает
СРОЧНО 30 Б . Как можно использовать стили для создания структуры документа?
Урок 14. кодирование текстовой информации — Информатика — 10 класс
Информатика, 10 класс. Урок № 14.
Тема — Кодирование текстовой информации
Цели и задачи урока:
— познакомиться со способами кодирования и декодирования текстовой информации с помощью кодовых таблиц и компьютера;
— познакомиться со способом определения информационного объема текстового сообщения;
— познакомиться с алгоритмом Хаффмана.
Вся информация в компьютере хранится в двоичном коде. Поэтому надо научиться преобразовывать символы в двоичный код.
Формула Хартли определяет количество информации в зависимости от количества возможных вариантов:
N=2i, где
N — это количество вариантов,
i — это количество бит, не обходимых для кодирования.
Если же мы преобразуем эту формулу и примем за N — количество символов в используемом алфавите (назовем это мощностью алфавита), то мы поймем, сколько памяти потребуется для кодирования одного символа.
N=2i, где N — кол-во возможных вариантов
i — кол-во бит, потребуемых для кодирования
Итак, если в нашем алфавите будет присутствовать только 32 символа, то каждый из них займет только 5 бит.
И тогда каждому символу мы дадим уникальный двоичный код. Такую таблицу мы будем назвать кодировочной.
Первая широко используемая кодировочная таблица была создана в США и называлась ASCII, что в переводе означало American standard code for information interchange. Как вы видите, в таблице присутствуют не только латинские буквы, но и цифры, и даже действия. Каждому символу отводится 7 бит, а значит, всего было закодировано 128 символов.
Но так как этого количества было недостаточно, стали создаваться другие таблицы, в которых можно было закодировать и другие символы. Например, таблица Windows-1251, которая, по сути, являлась изменением таблицы ASCII, в которую добавили буквы кириллицы. Таких таблиц было создано множество: MS-DOS, КОИ-8, ISO, Mac и другие:
Проблема использования таких различных таблиц приводила к тому, что текст, написанный на одном компьютере, мог некорректно читаться на другом. Например:
Поэтому была разработана международная таблица кодировки Unicode, включающая в себя как символы английского, русского, немецкого, арабского и других языков. На каждый символ в такой таблице отводится 16 бит, то есть она позволяет кодировать 65536 символов. Однако использование такой таблицы сильно «утяжеляет» текст. Поэтому существуют различные алгоритмы неравномерной кодировки текста, например, алгоритм Хаффмана.
АЛГОРИТМ ХАФФМАНА
Идея алгоритма Хаффмана основана на частоте появления символа в последовательности. Символ, который встречается в последовательности чаще всего, получает новый очень маленький код, а символ, который встречается реже всего, получает, наоборот, очень длинный код.
Пусть нам дано сообщение aaabcbeeffaabfffedbac.
Чтобы узнать наиболее выгодный префиксный код для такого сообщения, надо узнать частоту появления каждого символа в сообщении.
Шаг 1.
Подсчитайте и внесите в таблицу частоту появления каждого символа в сообщении:
У вас должно получиться:
Шаг 2.
Расположите буквы в порядке возрастания их частоты.
Шаг 3.
Теперь возьмем два символа с наименьшей чистотой и представим их листьями в дереве, частота которого будет равна сумме частот этих листьев.
Символы d и c превращаются в ветку дерева:
Шаг 4.
Проделываем эти шаги до тех пор, пока не получится дерево, содержащее все символы.
Итак, сортируем таблицу:
Шаг 5.
Объединяем символ e и символ cd в ветку дерева:
d
C
Шаг 6.
Сортируем:
Шаг 7.
Шаг 8.
Сортируем:
Шаг 9.
Шаг 10.
Сортируем:
Шаг 11.
Шаг 12.
Получился префиксный код. Теперь осталось расставить 1 и 0. Пусть каждая правая ветвь обозначает 1, а левая — 0.
Шаг 13.
Составляем код буквы, идя по ветке дерева от буквы к основанию дерева.
Тогда код для каждой буквы будет:
Задание №1
Закодируйте ASCII кодом слово MOSCOW.
Решение:
Составим таблицу и поместим туда слово MOSCOW. Используя таблицу ASCII кодов, закодируем все буквы слова:
M | O | S | C | O | W |
1001101 | 1001111 | 1010011 | 1000011 | 1001111 | 1110111 |
ОТВЕТ: 100110110011111010011100001110011111110111
Задание №2
Используя табличный код Windows1251, закодируйте слово КОМПЬЮТЕР.
Решение:
К | О | М | П | Ь | Ю | Т | Е | Р |
234 | 206 | 204 | 239 | 252 | 254 | 242 | 197 | 208 |
Ответ: 234206204239252254242197208
Задание №3
Используя алгоритма Хаффмана, закодируйте сообщение: Россия
Решение:
Давайте все левые ветви обозначим «1», а правые – «0»
Таким образом: С — 0, Р — 101, О — 100, И — 111, Я — 110
ОТВЕТ: 10110000111110
Двоичное кодирование текстовой информации — презентация онлайн
1. Д В О И Ч Н О Е К О Д И Р О В А Н И Е Т Е К С Т О В О Й И Н Ф О Р М А Ц И И
2. Ч т о т а к о е т е к с т ?
Первые компьютеры были созданы для обработкичисловой информации, но начиная с 60-х годов XX века,
возможность
обработки
и
текстовой
(символьной) информации.
Компьютерный текст – любая последовательность
символов из компьютерного алфавита. Текст может быть на
естественном языке (например, русском или английском),
может содержать химические или математические
формулы, таблицы и пр. Главное, чтобы все символы,
используемые в тексте, входили в компьютерный алфавит.
Алфавит должен включать латинские и русские
прописные и строчные буквы, цифры, знаки препинания и
арифметических операций, специальные знаки.
Для представления текста
в компьютерном алфавите используется
256 символов
3. В с п о м н и м …
Любая информация представляется в памяти компьютера вдвоичном виде.
Для компьютерной обработки текста необходимо
кодирование – преобразование входной информации
(каждого символа текста) в форму, воспринимаемую
компьютером, т.е. двоичный код.
Чтобы вывести текст из памяти на экран или печать, нужно
декодирование — преобразование двоичных кодов в символы.
Алфавит – множество символов для записи текста.
Мощность алфавита (N) – количество символов в алфавите.
Определить информационный вес символа (i), т. е.
количество бит для представления одного символа из
алфавита указанной мощности, можно по формуле Хартли:
N = 2I (256 = 28 i = 8 бит = 1 байт).
Для кодирования одного символа
в алфавите мощностью 256 символов требуется
8 бит или 1 байт информации.
4. Что такое т а б л и ц а к о д и р о в к и ?
Что такоет а б л и ц а
в к и ?
к о д и р о
Чтобы поставить в соответствие каждому символу числовой код
нужна таблица кодировки – стандарт, в котором всем символам
компьютерного алфавита поставлены в соответствие порядковые
номера в двоичной системе счисления.
Международным стандартом является таблица кодировки ASCII
Для кодировки русских букев существует пять различных кодовых
таблиц : КОИ-8, СЗ1251, СР866, Mac, ISO
В последнее время появился новый международный стандарт
UNICODE, в котором для представления символа отводится 2 байта.
5. С т а н д а р т A S C I I
В 1967 году в США был введен код ASCII (Аmerican StandartCode for Information Interchange — Американский Стандартный
Код для Обмена Информацией). В нем каждому символу
ставился в соответствие 7-битный двоичный код, всего 128
символов (кодов), из них:
Управляющие (коды от 0 до 31, а также 127), не
отображаются на экране;
Отображаемые (коды от 32 до 126). Код 32 – пробел,
отображает пропуск на экране. Далее следуют знаки
препинания, скобки, арабские цифры (0 — 9), некоторые знаки,
латинские прописные, затем строчные буквы, знаки.
После модификации в 1977 году стандартом был принят 1
байт, и каждому символу в ASCII поставлено число от 00000000
до 11111111 (0 — 255 в десятичной системе счисления).
Коды 0 -127 — являются международным стандартом,
128 – 255 используются для национальных алфавитов и
специальных знаков (расширенная таблица).
6. К о д и р о в к а к и р и л л и ц ы
Стандарт CP866, альтернативная кодировка — кодоваястраница, где все специфические европейские символы в верхней
половине кодовой таблицы были заменены на кириллицу.
Популярен в среде MS-DOS и OS/2. Разработана в ВЦ АН СССР,
для которого впервые в СССР была закуплена партия IBM PC.
Стандарт CP1251. Кодовая страница Microsoft CP1251 создана
Microsoft как стандарт для кодировки кириллицы в Windows.
Стандарт КОИ8. В нем символы русской кириллицы поместили
так, что позиции символов кириллицы соответствуют их
фонетическим аналогам в английском алфавите. Это означает,
что если в тексте, написанном в КОИ8, убрать восьмой бит
каждого символа, то мы имеем «читабельный» текст, хотя он и
написан английскими символами. KOI8-R быстро стал фактически
стандартом для русской кириллицы в Internet
7. К о д и р о в к а A S C I I (коды 0 – 127)
К о д и р о в к а A S C I I– 127)
(коды 0
8. К о д и р о в к а Windows-1251 (CP1251)
9. С т а н д а р т K O I 8 — R
10. С т а н д а р т C P 8 6 6
11. Сортировка текста по алфавиту
Втаблицах
кодировки
соблюдается
принцип
последовательного кодирования (лексикографический): в
начале упорядочены цифры (от 0 до 9), затем приводится
латинский алфавит: прописные (большие), затем — строчные
(маленькие) буквы, во второй части таблицы дается кириллица
(русский алфавит), также сначала прописные, затем строчные
буквы. Этот принцип позволяет сортировать символьную
информацию.
Пример
Изучите в приведенных кодировках размещение символов.
Попробуйте определить: в
каком порядке будут идти
фрагменты текста «excel», «байт», «8в», «10г», «9а», «10а», если
упорядочить их по возрастанию?
Ответ: «10а», «10г», «8в», «9а», «excel», «байт»
Почему? Сначала будут упорядочены по возрастанию коды первых символов,
затем, затем среди одинаковых первых символов, будут упорядочены вторые и
т. д.
12. Информационный объем текста
Статьи, рефераты, дипломы и прочие документы,подготавливают на компьютере в текстовых редакторах. Обычно
известно, какая кодировка используется программой. Все это
позволяет определить информационный объем документа.
Пример
Пусть реферат содержит 32 страницы; на каждой странице —
32 строки, в каждой строке — 64 символа. Определить
информационный объем реферата в кодировке ASCII .
Одна страница содержит 32 x 64 = 25 x 26 = 211 символов. Тогда в
всем реферате: 32 x 211 = 25 x 211 = 216 символов. В кодировке ASCII
для хранения символа требуется один байт. Объем реферата: 216
х 1 = 216 байт = 216/ 210 = 26 Кбайт = 64 Кбайта
13. Р е ша е м з а д а ч и с а м и …
Р е ша е м1.
з а д а ч и
с а м и …
Оцените информационный объем сообщения в битах и байтах,
представленного в кодировке ASCII:
2.
В одном килограмме 1000 граммов
3.
Какое сообщение закодировано в кодировке Windows-1251:
0011010100100000111000011110000011101011111010111110111011100010
4.
Считая, что каждый символ кодируется двумя байтами, оцените
информационный объем следующего предложения из пушкинского
четверостишия:
Певец-Давид был ростом мал, Но повалил же Голиафа!
5.
Выбрать слово, имеющее наибольшую сумму кодов символов в таблице
кодировки ASCII.
6.
А. окно; B. кино; C. ника; D. конь; E. ночь.
7.
Выбрать слово, имеющее наибольшую сумму кодов символов в таблице
кодировки ASCII.
8.
А. 2b2d; B. файл; C. file; D. 1999; E. 2001.
11.
Декодируйте следующее сообщение, записанное восьмибитовой кодировке:
01010101 01110000 00100000 00100110 00100000
01000100 01101111 01110111 01101110
11.
Определите вид кодировки и декодируйте следующие сообщения:
а) 235 207 212 197 204 216 206 201 203 207 215
б) 213 224 244 244 236 224 237
14. О т в е т ь т е н а в о п р о с ы …
О т в е т ь т е1.
2.
3.
4.
5.
6.
7.
8.
н а
…
в о п р о с ы
Что такое компьютерный текст?
Что такое кодирование?
Что такое алфавит? мощность алфавита?
Что такое таблица кодировки?
В чем суть принципа последовательного кодирования?
Какие вам известны таблицы кодировки?
Какие Вам известны таблицы кодировок?
Как определить информационный объем текста.?
Как работают кодировки текста. Откуда появляются «кракозябры». Принципы кодирования. Обобщение и детальный разбор
Данная статья имеет цель собрать воедино и разобрать принципы и механизм работы кодировок текста, подробно этот механизм разобрать и объяснить. Полезна она будет тем, кто только примерно представляет, что такое кодировки текста и как они работают, чем отличаются друг от друга, почему иногда появляются не читаемые символы, какой принцип кодирования имеют разные кодировки.
Чтобы получить детальное понимание этого вопроса придется прочитать и свести воедино не одну статью и потратить довольно значительное время на это. В данном материале же это все собрано воедино и по идее должно сэкономить время и разбор на мой взгляд получился довольно подробный.
О чем будет под катом: принцип работы одно байтовых кодировок (ASCII, Windows-1251 и т.д.), предпосылки появления Unicode, что такое Unicode, Unicode-кодировки UTF-8, UTF-16, их отличия, принципиальные особенности, совместимость и несовместимость разных кодировок, принципы кодирования символов, практический разбор кодирования и декодирования.
Вопрос с кодировками сейчас конечно уже потерял актуальность, но все же знать как они работают сейчас и как работали раньше и при этом не потратить много времени на это думаю лишним не будет.
Предпосылки Unicode
Начать думаю стоит с того времени когда компьютеризация еще не была так сильно развита и только набирала обороты. Тогда разработчики и стандартизаторы еще не думали, что компьютеры и интернет наберут такую огромную популярность и распространенность. Собственно тогда то и возникла потребность в кодировке текста. В каком то же виде нужно было хранить буквы в компьютере, а он (компьютер) только единицы и нули понимает. Так была разработана одно-байтовая кодировка ASCII (скорее всего она не первая кодировка, но она наиболее распространенная и показательная, по этому ее будем считать за эталонную). Что она из себя представляет? Каждый символ в этой кодировке закодирован 8-ю битами. Несложно посчитать что исходя из этого кодировка может содержать 256 символов (восемь бит, нулей или единиц 2
8=256).
Первые 7 бит (128 символов 27=128) в этой кодировке были отданы под символы латинского алфавита, управляющие символы (такие как переносы строк, табуляция и т.д.) и грамматические символы. Остальные отводились под национальные языки. То есть получилось что первые 128 символов всегда одинаковые, а если хочешь закодировать свой родной язык пожалуйста, используй оставшуюся емкость. Собственно так и появился огромный зоопарк национальных кодировок. И теперь сами можете представить, вот например я находясь в России беру и создаю текстовый документ, у меня по умолчанию он создается в кодировке Windows-1251 (русская кодировка использующаяся в ОС Windows) и отсылаю его кому то, например в США. Даже то что мой собеседник знает русский язык, ему не поможет, потому что открыв мой документ на своем компьютере (в редакторе с дефолтной кодировкой той же самой ASCII) он увидит не русские буквы, а кракозябры. Если быть точнее, то те места в документе которые я напишу на английском отобразятся без проблем, потому что первые 128 символов кодировок Windows-1251 и ASCII одинаковые, но вот там где я написал русский текст, если он в своем редакторе не укажет правильную кодировку будут в виде кракозябр.
Думаю проблема с национальными кодировками понятна. Собственно этих национальных кодировок стало очень много, а интернет стал очень широким, и в нем каждый хотел писать на своем языке и не хотел чтобы его язык выглядел как кракозябры. Было два выхода, указывать для каждой страницы кодировки, либо создать одну общую для всех символов в мире таблицу символов. Победил второй вариант, так создали Unicode таблицу символов.
Небольшой практикум ASCII
Возможно покажется элементарщиной, но раз уж решил объяснять все и подробно, то это надо.
Вот таблица символов ASCII:
Тут имеем 3 колонки:
- номер символа в десятичном формате
- номер символа в шестнадцатиричном формате
- представление самого символа.
Итак, закодируем строку «ok» (англ.) в кодировке ASCII. Символ «o» (англ.) имеет позицию 111 в десятичном виде и
6Fв шестнадцатиричном. Переведем это в двоичную систему —
01101111
. Символ «k» (англ.) — позиция 107 в десятеричной и
6Bв шестнадцатиричной, переводим в двоичную —
01101011
. Итого строка «ok» закодированная в ASCII будет выглядеть так —
01101111 01101011
. Процесс декодирования будет обратный. Берем по 8 бит, переводим их в 10-ичную кодировку, получаем номер символа, смотрим по таблице что это за символ.
Unicode
С предпосылками создания общей таблицы для всех в мире символов, разобрались. Теперь собственно, к самой таблице. Unicode — именно эта таблица и есть (это не кодировка, а именно таблица символов). Она состоит из 1 114 112 позиций. Большинство этих позиций пока не заполнены символами, так что вряд ли понадобится это пространство расширять.
Разделено это общее пространство на 17 блоков, по 65 536 символов в каждом. Каждый блок содержит свою группу символов. Нулевой блок — базовый, там собраны наиболее употребляемые символы всех современных алфавитов. Во втором блоке находятся символы вымерших языков. Есть два блока отведенные под частное использование. Большинство блоков пока не заполнены.
Итого емкость символов юникода составляет от 0 до 10FFFF (в шестнадцатиричном виде).
Записываются символы в шестнадцатиричном виде с приставкой «U+». Например первый базовый блок включает в себя символы от U+0000 до U+FFFF (от 0 до 65 535), а последний семнадцатый блок от U+100000 до U+10FFFF (от 1 048 576 до 1 114 111).
Отлично теперь вместо зоопарка национальных кодировок, у нас есть всеобъемлющая таблица, в которой зашифрованы все символы которые нам могут пригодиться. Но тут тоже есть свои недостатки. Если раньше каждый символ был закодирован одним байтом, то теперь он может быть закодирован разным количеством байтов. Например для кодирования всех символов английского алфавита по прежнему достаточно одного байта например тот же символ «o» (англ.) имеет в юникоде номер U+006F, то есть тот же самый номер как и в ASCII — 6F в шестнадцатиричной и 111 в десятеричной. А вот для кодирования символа «U+103D5» (это древнеперсидская цифра сто) — 103D5 в шестнадцатиричной и 66 517 в десятеричной, тут нам потребуется уже три байта.
Решить эту проблему уже должны юникод-кодировки, такие как UTF-8 и UTF-16. Далее речь пойдет про них.
UTF-8
UTF-8 является юникод-кодировкой переменной длинны, с помощью которой можно представить любой символ юникода.
Давайте поподробнее про переменную длину, что это значит? Первым делом надо сказать, что структурной (атомарной) единицей этой кодировки является байт. То что кодировка переменной длинны, значит, что один символ может быть закодирован разным количеством структурных единиц кодировки, то есть разным количеством байтов. Так например латиница кодируется одним байтом, а кириллица двумя байтами.
Немного отступлю от темы, надо написать про совместимость ASCII и UTF
То что латинские символы и основные управляющие конструкции, такие как переносы строк, табуляции и т.д. закодированы одним байтом делает utf-кодировки совместимыми с кодировками ASCII. То есть фактически латиница и управляющие конструкции находятся на тех же самых местах как в ASCII, так и в UTF, и то что закодированы они и там и там одним байтом и обеспечивает эту совместимость.
Давайте возьмем символ «o»(англ.) из примера про ASCII выше. Помним что в таблице ASCII символов он находится на 111 позиции, в битовом виде это будет 01101111
. В таблице юникода этот символ — U+006F что в битовом виде тоже будет 01101111
. И теперь так, как UTF — это кодировка переменной длины, то в ней этот символ будет закодирован одним байтом. То есть представление данного символа в обеих кодировках будет одинаково. И так для всего диапазона символов от 0 до 128. То есть если ваш документ состоит из английского текста то вы не заметите разницы если откроете его и в кодировке UTF-8 и UTF-16 и ASCII (прим. в UTF-16 такие символы все равно будут закодированы двумя байтами, по этому вы не увидите разницы, если ваш редактор будет игнорировать нулевые байты), и так до момента пока вы не начнете работать с национальным алфавитом.
Сравним на практике как будет выглядеть фраза «Hello мир» в трех разных кодировках: Windows-1251 (русская кодировка), ISO-8859-1 (кодировка западно-европейских языков), UTF-8 (юникод-кодировка). Суть данного примера состоит в том что фраза написана на двух языках. Посмотрим как она будет выглядеть в разных кодировках.
В кодировке ISO-8859-1 нет таких символов «м», «и» и «р».
Теперь давайте поработаем с кодировками и разберемся как преобразовать строку из одной кодировки в другую и что будет если преобразование неправильное, или его нельзя осуществить из за разницы в кодировках.
Будем считать что изначально фраза была записана в кодировке Windows-1251. Исходя из таблицы выше запишем эту фразу в двоичном виде, в кодировке Windows-1251. Для этого нам потребуется всего только перевести из десятеричной или шестнадцатиричной системы (из таблицы выше) символы в двоичную.
01001000 01100101 01101100 01101100 01101111 00100000 11101100 11101000 11110000
Отлично, вот это и есть фраза «Hello мир» в кодировке Windows-1251.
Теперь представим что вы имеете файл с текстом, но не знаете в какой кодировке этот текст. Вы предполагаете что он в кодировке ISO-8859-1 и открываете его в своем редакторе в этой кодировке. Как сказано выше с частью символов все в порядке, они есть в этой кодировке, и даже находятся на тех же местах, но вот с символами из слова «мир» все сложнее. Этих символов в этой кодировке нет, а на их местах в кодировке ISO-8859-1 находятся совершенно другие символы. А конкретно «м» — позиция 236, «и» — 232. «р» — 240. И на этих позициях в кодировке ISO-8859-1 находятся следующие символы позиция 236 — символ «ì», 232 — «è», 240 — «ð»
Значит фраза «Hello мир» закодированная в Windows-1251 и открытая в кодировке ISO-8859-1 будет выглядеть так: «Hello ìèð». Вот и получается что эти две кодировки совместимы лишь частично, и корректно перекодировать строку из одной кодировке в другую не получится, потому что там просто напросто нет таких символов.
Тут и будут необходимы юникод-кодировки, а конкретно в данном случае рассмотрим UTF-8. То что символы в ней могут быть закодированы разным количеством байтов от 1 до 4 мы уже выяснили. Теперь стоит сказать что с помощью UTF могут быть закодированы не только 256 символов, как в двух предыдущих, а вобще все символы юникода
Работает она следующим образом. Первый бит каждого байта кодирующего символ отвечает не за сам символ, а за определение байта. То есть например если ведущий (первый) бит нулевой, то это значит что для кодирования символа используется всего один байт. Что и обеспечивает совместимость с ASCII. Если внимательно посмотрите на таблицу символов ASCII то увидите что первые 128 символов (английский алфавит, управляющие символы и знаки препинания) если их привести к двоичному виду, все начинаются с нулевого бита (будьте внимательны, если будете переводить символы в двоичную систему с помощью например онлайн конвертера, то первый нулевой ведущий бит может быть отброшен, что может сбить с толку).
01001000
— первый бит ноль, значит 1 байт кодирует 1 символ -> «H»
01100101
— первый бит ноль, значит 1 байт кодирует 1 символ -> «e»
Если первый бит не нулевой то символ кодируется несколькими байтами.
Для двухбайтовых символов первые три бита должны быть такие — 110
11010000 10111100
— в начале 110, значит 2 байта кодируют 1 символ. Второй байт в таком случае всегда начинается с 10. Итого отбрасываем управляющие биты (начальные, которые выделены красным и зеленым) и берем все оставшиеся (10000111100
), переводим их в шестнадцатиричный вид (043С) -> U+043C в юникоде равно символ «м».
для трех-байтовых символов в первом байте ведущие биты — 1110
11101000 10000111 101010101
— суммируем все кроме управляющих битов и получаем что в 16-ричной равно 103В5, U+103D5 — древнеперситдская цифра сто (10000001111010101
)
для четырех-байтовых символов в первом байте ведущие биты — 11110
11110100 10001111 10111111 10111111
— U+10FFFF это последний допустимый символ в таблице юникода (100001111111111111111
)
Теперь, при желании, можем записать нашу фразу в кодировке UTF-8.
UTF-16
UTF-16 также является кодировкой переменной длинны. Главное ее отличие от UTF-8 состоит в том что структурной единицей в ней является не один а два байта. То есть в кодировке UTF-16 любой символ юникода может быть закодирован либо двумя, либо четырьмя байтами. Давайте для понятности в дальнейшем пару таких байтов я буду называть кодовой парой. Исходя из этого любой символ юникода в кодировке UTF-16 может быть закодирован либо одной кодовой парой, либо двумя.
Начнем с символов которые кодируются одной кодовой парой. Легко посчитать что таких символов может быть 65 535 (2в16), что полностью совпадает с базовым блоком юникода. Все символы находящиеся в этом блоке юникода в кодировке UTF-16 будут закодированы одной кодовой парой (двумя байтами), тут все просто.
символ «o» (латиница) — 00000000 01101111
символ «M» (кириллица) — 00000100 00011100
Теперь рассмотрим символы за пределами базового юникод диапазона. Для их кодирования потребуется уже две кодовые пары (4 байта). И механизм их кодирования немного сложнее, давайте по порядку.
Для начала введем понятия суррогатной пары. Суррогатная пара — это две кодовые пары используемые для кодирования одного символа (итого 4 байта). Для таких суррогатных пар в таблице юникода отведен специальный диапазон от D800 до DFFF. Это значит, что при преобразовании кодовой пары из байтового вида в шестнадцатиричный вы получаете число из этого диапазона, то перед вами не самостоятельный символ, а суррогатная пара.
Чтобы закодировать символ из диапазона 10000 — 10FFFF (то есть символ для которого нужно использовать более одной кодовой пары) нужно:
- из кода символа вычесть 10000(шестнадцатиричное) (это наименьшее число из диапазона 10000 — 10FFFF)
- в результате первого пункта будет получено число не больше FFFFF, занимающее до 20 бит
- ведущие 10 бит из полученного числа суммируются с D800 (начало диапазона суррогатных пар в юникоде)
- следующие 10 бит суммируются с DC00 (тоже число из диапазона суррогатных пар)
- после этого получатся 2 суррогатные пары по 16 бит, первые 6 бит в каждой такой паре отвечают за определение того что это суррогат,
- десятый бит в каждом суррогате отвечает за его порядок если это 1 то это первый суррогат, если 0, то второй
Разберем это на практике, думаю станет понятнее.
Для примера зашифруем символ, а потом расшифруем. Возьмем древнеперсидскую цифру сто (U+103D5):
- 103D5 — 10000 = 3D5
- 3D5 =
0000000000 1111010101
(ведущие 10 бит получились нулевые приведем это к шестнадцатиричному числу, получим 0 (первые десять), 3D5 (вторые десять)) - 0 + D800 = D800 (
1101100000000000
) первые 6 бит определяют что число из диапазона суррогатных пар десятый бит (справа) нулевой, значит это первый суррогат - 3D5 + DC00 = DFD5 (
1101111111010101
) первые 6 бит определяют что число из диапазона суррогатных пар десятый бит (справа) единица, значит это второй суррогат - итого данный символ в UTF-16 —
1101100000000000 1101111111010101
Теперь наоборот раскодируем. Допустим что у нас есть вот такой код — 1101100000100010 1101111010001000:
- переведем в шестнадцатиричный вид = D822 DE88 (оба значения из диапазона суррогатных пар, значит перед нами суррогатная пара)
1101100000100010
— десятый бит (справа) нулевой, значит первый суррогат1101111010001000
— десятый бит (справа) единица, значит второй суррогат- отбрасываем по 6 бит отвечающих за определение суррогата, получим
0000100010 1010001000
(8A88) - прибавляем 10000 (меньшее число суррогатного диапазона) 8A88 + 10000 = 18A88
- смотрим в таблице юникода символ U+18A88 = Tangut Component-649. Компоненты тангутского письма.
Спасибо тем кто смог дочитать до конца, надеюсь было полезно и не очень занудно.
Вот некоторые интересные ссылки по данной теме:
habr.com/ru/post/158895 — полезные общие сведения по кодировкам
habr.com/ru/post/312642 — про юникод
unicode-table.com/ru — сама таблица юникод символов
Ну и собственно куда же без нее
ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4 — юникод
ru.wikipedia.org/wiki/ASCII — ASCII
ru.wikipedia.org/wiki/UTF-8 — UTF-8
ru.wikipedia.org/wiki/UTF-16 — UTF-16
|
Онлайн калькулятор: Кодировка файла
В предыдущей статье я уже затрагивал тему кодировок текста, более подробно описал Юникод и представление его в виде последовательности символов переменной длины UTF-8. Данный калькулятор позволяет преобразовать текст в другие исторические кодировки. Я называю их историческими, потому, что в современных решениях везде, где это можно следует использовать Юникод и его самое удобное представление UTF-8.
Однако старые кодировки также могут быть полезны, когда требуется компактно закодировать текст, например для последующего сжатия и передачи, в том случае, когда принимающая сторона гарантированно знает в какой кодировке передается текст. Например русский текст в в кодировке Windows-1251 будет занимать вдвое меньше места, чем текст в UTF-8.
Итак калькулятор ниже позволяет скачать файл в выбранной кодировке или просмотреть шестнадцатеричный дамп закодированного текста.
Скачать текст как файл с выбором кодировки
КодировкаAtari STCP 856 HebrewDOS Arabic (CP864)DOS Baltic Rim (CP775)DOS Cyrillic (CP855)DOS Cyrillic Russian (CP866)DOS French Canada (CP863)DOS Greek (CP737)DOS Greek 2 (CP869)DOS Hebrew (CP862)DOS Icelandic (CP861)DOS Latin 1 (CP850)DOS Latin 2 (CP852)DOS Latin US (CP437)DOS Nordic (CP865)DOS Portuguese (CP860)DOS Turkish (CP857)EBCDIC 037 USA/CanadaEBCDIC 1026 TurkishEBCDIC 424 HebrewEBCDIC 500 InternationalEBCDIC 875 GreekGSM 03.38ISO 8-bit Urdu (IBM CP1006)ISO 8859-2 (Latin-2)ISO 8859-5ISO 8859-6ISO 8859-7ISO-IR-68ISO/IEC 8859-1 (Latin-1)ISO/IEC 8859-10 (Latin-6)ISO/IEC 8859-11 ISO/IEC 8859-13 (Latin-7)ISO/IEC 8859-14ISO/IEC 8859-15 (Latin-9)ISO/IEC 8859-16 (Latin-10)ISO/IEC 8859-3ISO/IEC 8859-4 (Latin-4)ISO/IEC 8859-8ISO/IEC 8859-9KOI8-RKOI8-UKPS 9566KZ-1048 Mac OS CelticMac OS Central EuropeanMac OS CroatianMac OS CyrillicMac OS DingbatsMac OS GaelicMac OS GreekMac OS IcelandicMac OS InuitMac OS RomanMac OS RomanianMac OS TurkishUTF-8Windows-1250Windows-1251Windows-1252Windows-1253Windows-1254Windows-1255Windows-1256Windows-1257Windows-1258Windows-874Windows-932Windows-936Windows-949Windows-950Чу, я слышу пушек гром!Входной текст
Шестнадцатеричный дамп
content_copy Ссылка save Сохранить extension Виджет
Просмотреть созданный файл можно при помощи калькулятора Прочитать файл в старой кодировке.
Калькулятор вернет ошибку, в том случае, если выбрана неверная кодировка. В случае с Юникодом, это невозможно — в нем представлены символы всех современных языков. А вот устаревшие 8-битные кодировки содержат ограниченный набор символов и для текста на нескольких языках может вполне не найтись нужной кодировки.
За годы до появления Юникода было придумано множество кодировок для разных языков и наборов символов, поэтому сама задача выбора правильной кодировки для вашего текста может быть непростой. Следующий калькулятор позволяет подобрать кодировки для введенного текста. В результирующей таблице будут выданы, только те кодировки, при помощи которых можно гарантированно закодировать заданный текст.
В какой кодировке можно представить текст?
Чу, я слышу пушек гром!Входной текст
КодировкаAtari STCP 856 HebrewDOS Arabic (CP864)DOS Baltic Rim (CP775)DOS Cyrillic (CP855)DOS Cyrillic Russian (CP866)DOS French Canada (CP863)DOS Greek (CP737)DOS Greek 2 (CP869)DOS Hebrew (CP862)DOS Icelandic (CP861)DOS Latin 1 (CP850)DOS Latin 2 (CP852)DOS Latin US (CP437)DOS Nordic (CP865)DOS Portuguese (CP860)DOS Turkish (CP857)EBCDIC 037 USA/CanadaEBCDIC 1026 TurkishEBCDIC 424 HebrewEBCDIC 500 InternationalEBCDIC 875 GreekGSM 03.38ISO 8-bit Urdu (IBM CP1006)ISO 8859-2 (Latin-2)ISO 8859-5ISO 8859-6ISO 8859-7ISO-IR-68ISO/IEC 8859-1 (Latin-1)ISO/IEC 8859-10 (Latin-6)ISO/IEC 8859-11 ISO/IEC 8859-13 (Latin-7)ISO/IEC 8859-14ISO/IEC 8859-15 (Latin-9)ISO/IEC 8859-16 (Latin-10)ISO/IEC 8859-3ISO/IEC 8859-4 (Latin-4)ISO/IEC 8859-8ISO/IEC 8859-9KOI8-RKOI8-UKPS 9566KZ-1048 Mac OS CelticMac OS Central EuropeanMac OS CroatianMac OS CyrillicMac OS DingbatsMac OS GaelicMac OS GreekMac OS IcelandicMac OS InuitMac OS RomanMac OS RomanianMac OS TurkishUTF-8Windows-1250Windows-1251Windows-1252Windows-1253Windows-1254Windows-1255Windows-1256Windows-1257Windows-1258Windows-874Windows-932Windows-936Windows-949Windows-950Файл очень большой, при загрузке и создании может наблюдаться торможение браузера.
Загрузить close
content_copy Ссылка save Сохранить extension Виджет
В калькуляторах поддерживаются 70 различных кодировок:
Кодировки IBM EBCDIC
EBCDIC — стандартный 8-битный код, разработанный корпорацией IBM для использования на мэйнфреймах IBM и совместимых с ними.
Кодировка | Языки / Страны использования |
---|---|
EBCDIC 424 Hebrew | Иврит |
EBCDIC 037 USA/Canada | США, Канада, Португалия, Бразилия, Австралия, Новой Зеландия и Южной Африка |
EBCDIC 1026 Turkish | Турция |
EBCDIC 500 International | Интернациональный |
EBCDIC 875 Greek | Греческий |
Кодировки в стандарте ISO 8859
Семейство ASCII совместимых кодировок, разработанных международными организациями ISO и IEC
Кодировка | Языки/Страны |
---|---|
ISO 8859-2 (Latin-2) | Восточноевропейские языки, использующие латиницу |
ISO 8859-5 | Кириллица |
ISO 8859-6 | Арабский |
ISO 8859-7 | Современный греческий |
ISO/IEC 8859-1 (Latin-1) | Западноевропейские языки |
ISO/IEC 8859-10 (Latin-6) | Североевропейские языки |
ISO/IEC 8859-11 | Тайский |
ISO/IEC 8859-13 (Latin-7) | Эстонский, латышский, литовский |
ISO/IEC 8859-14 | Кельтские языки |
ISO/IEC 8859-15 (Latin-9) | Западноевропейские языки |
ISO/IEC 8859-16 (Latin-10) | Восточноевропейские языки, использующие латиницу |
ISO/IEC 8859-3 | Турецкий, мальтийский, эсперанто |
ISO/IEC 8859-4 (Latin-4) | Эстонский, латышский, литовский, гренландский, саамский |
ISO/IEC 8859-8 | Иврит |
ISO/IEC 8859-9 | Турецкий |
Кодировки KOI8
KOI8 — 8-битовая кодировка совместимая с ASCII для представления букв кириллических алфавитов
Кодировка | Языки |
---|---|
KOI8-R | Русский |
KOI8-U | Украинский |
Кодировки Mac OS
Кодировка | Языки/Страны |
---|---|
Mac OS Celtic | Кельтские языки |
Mac OS Gaelic | Гэльский |
Mac OS Central European | Языки Центральной Европы |
Mac OS Croatian | Сербско/Хорватский |
Mac OS Cyrillic | Кириллица |
Mac OS Greek | Греческй |
Mac OS Icelandic | Исландский |
Mac OS Inuit | Инуктитут |
Mac OS Roman | Западноевропейские языки |
Mac OS Romanian | Румынский |
Mac OS Turkish | Турецкий |
Кодировки DOS
Кодировки для MS-DOS и подобных ей операционных систем.
Кодировка | Языки/Страны |
---|---|
DOS Latin US (CP437) | Восточноевропейские языки, использующие латиницу |
DOS Greek (CP737) | Греческий |
DOS Baltic Rim (CP775) | Эстонский, латышский, литовский |
DOS Latin 1 (CP850) | Западноевропейские языки |
DOS Latin 2 (CP852) | Восточноевропейские языки, использующие латиницу |
DOS Cyrillic (CP855) | Кириллица |
CP 856 Hebrew | Иврит |
DOS Turkish (CP857) | Турецкий |
DOS Portuguese (CP860) | Португальский |
DOS Icelandic (CP861) | Исландский |
DOS Hebrew (CP862) | Иврит |
DOS French Canada (CP863) | Французский |
DOS Arabic (CP864) | Арабский |
DOS Nordic (CP865) | Норвежский |
DOS Cyrillic Russian (CP866) | Русский |
DOS Greek 2 (CP869) | Греческий |
Кодировки Windows
Кодировка | Языки/Страны |
---|---|
Windows-1250 | Языки Центральной и Восточной Европы |
Windows-1251 | Русский, украинский белорусский, сербский, македонский, болгарский |
Windows-1252 | Западноевропейские языки |
Windows-1253 | Современный греческий |
Windows-1254 | Турецкий |
Windows-1255 | Иврит |
Windows-1256 | Арабский |
Windows-1257 | Эстонский, латышский, литовский |
Windows-1258 | Вьетнамский |
Windows-874 | Тайский |
Windows-932 | Японский |
Windows-936 | Упрощенный китайский |
Windows-949 | Корейский |
Windows-950 | Традиционный китайский |
KZ-1048 | Казахский |
Прочие кодировки
Кодировка | Описание |
---|---|
Atari ST | Кодировка, использовалась в домашних персональных компьютерах фирмы Atari |
GSM 03.38 | Кодировка использовалась в сетях GSM для SMS (коротких сообщений), CB (широковещательная передача коротких сообщений) and USSD (Сервис для организации интерактивных взаимодействий) |
KPS 9566 | Кодировка, разработанная в Северной Корее для поддержки символов корейского языка Хангыль |
ISO 8-bit Urdu (IBM CP1006) | Использовалась компанией IBM в операционной системе AIX в Пакистане для языка Урду |
ISO-IR-68 | Кодировка для представления символов в языке программирования APL |
Правила преобразования исторических кодировок в Юникод были получены с сайта unicode.org
URL кодирование и декодирование
Для тех кто не любит нудных объяснений 🙂
Введите строку в одно из полей и нажмите соответствующую кнопку
Строка в закодированном видеСтрока в нормальном виде
Для тех кто любит «во всем разобраться» 😉
Кодирование URL и просто двоичных данных в последовательность букв, цифр и некоторых специальных знаков латинского алфавита в интернете было связано с ограничением физических устройств на передачу только алфавитно-цифровых символов. В URL такое кодирование обычно применяется для передачи символов в формате Unicode (как правило UTF-8) в последовательность из двух байт, записанных в шестнадцатиричном представлении. Каждый байт предваряется знаком %. При таком кодировании строчка «корова» будет иметь вид: %D0%BA%D0%BE%D1%80%D0%BE%D0%B2%D0%B0. То есть русской букве к будет соответствовать последовательность %D0%BA и.т.д. Такое кодирование является общепринятым для путей к файлам или папкам, входящим в URL.
Подмножесто символов, которые разрешены в URL немного шире чем алфавитно-цифровые символы, так, в URL можно использовать дефис и подчеркивание, но нельзя, например, использовать одинарные или двойные кавычки. Некоторые символы используют для разделения параметров в URL, и их кодирование в этом случае будет неправомочным. В зависимости от отношения к кодированию специальных символов в javascript различают функции encodeURI и decodeURI, которые могут работать с полным URL, и, функции encodeURIComponent / decodeURIComponent, применяемые для параметров, входящих в URL.
Вообще говоря, кодирование параметров может быть достаточно произвольным. Здесь разработчик может использовать любую схему кодировки, если состав ее символов будет коректно передаваться через сеть. Так, вместо строки кириллицы в utf-8 можно применить строку в кодировке Windows 1251. В этом случае слово «корова» будет выглядеть как %EA%EE%F0%EE%E2%E0. То есть, символу к будет соответствовать последовательность из двух букв со знаком процента перед ними — %EA. Закодировать в строки с процентами кириллицу из других кодировок можно в нашем HTML кодировщике. В принципе, допустимы также другие способы кодирования, например, escape/unescape функцию javascript. Слово «корова» в этом случае будет выглядеть как %u043A%u043E%u0440%u043E%u0432%u0430.
URL кодировщик с расширенными возможностями
powershell — невозможно изменить кодировку текстовых файлов в Windows
В Windows PowerShell вы не сможете использовать встроенные командлеты по двум причинам:
Исходя из кодовой страницы OEM
852
, я предполагаю, что ваша кодовая страница «ANSI» —Windows-1250
(обе определены локалью унаследованной системы), что не соответствует вашемуWindows-1251
, закодированному входные файлы.Использование
Set-Content
(и аналогичный) с-Encoding UTF8
неизменно создает файлы с BOM (метка порядка байтов) , которую Java и, в более общем плане, утилиты Unix-наследия не понимают .
Примечание. PowerShell Core фактически по умолчанию использует без спецификации UTF8, а также позволяет передавать любой доступный экземпляр [System.Text.Encoding]
в параметр -Encoding
, чтобы вы могли решить свою проблему. со встроенными там командлетами, при этом необходимо прямое использование платформы .NET только для создания экземпляра кодирования.
Следовательно, вы должны использовать .NET framework напрямую:
Get-ChildItem *.nfo -Recurse | ForEach-Object {
$ file = $ _. FullName
$ mustReWrite = $ ложь
# Попробуйте сначала прочитать как UTF-8 и выбросить исключение, если
Обнаружены # недопустимые байты как-UTF-8.
пытаться {
[IO.File] :: ReadAllText ($ file, [Text.Utf8Encoding] :: new ($ false, $ true))
} catch [System.Text.DecoderFallbackException] {
# Вернуться к Windows-1251
$ content = [IO.File] :: ReadAllText ($ file, [Text.Encoding] :: GetEncoding (1251))
$ mustReWrite = $ true
}
# Переписать как UTF-8 без спецификации (по умолчанию для .NET framework)
if ($ mustReWrite) {
Write-Verbose «Преобразование 1251 в UTF-8: $ file»
[IO.Файл] :: WriteAllText ($ file, $ content)
} еще {
Write-Verbose "Уже в кодировке UTF-8: $ file"
}
}
Примечание. Как и в вашей собственной попытке, приведенное выше решение считывает каждый файл в память целиком, но это можно изменить.
Примечание:
Если входной файл содержит только байты с символами диапазона ASCII (7 бит), он по определению также закодирован в UTF-8, поскольку UTF-8 является расширенным набором кодировки ASCII.
Это очень маловероятно с реальным вводом, но чисто технически файл в кодировке Windows-1251 может также быть допустимым файлом UTF-8 , если , битовые шаблоны и последовательности байтов оказываются действительный UTF-8 (который имеет строгие правила относительно того, какие битовые шаблоны и где разрешены).
Однако такой файл не будет содержать значимого содержимого Windows-1251.Нет никаких причин для реализации резервной стратегии для декодирования с помощью Windows-1251, потому что нет никаких технических ограничений на то, какие битовые шаблоны могут встречаться и где.
Как правило, при отсутствии внешней информации (или спецификации) нет простого и надежного способа сделать вывод о кодировке файла только по его содержимому (хотя можно использовать эвристику).
ubuntu — преобразование кириллицы Procmail
Похоже, вы говорите о RFC 2047: MIME-кодирование для заголовков электронной почты.Дальнейшие RFC с тех пор расширили этот RFC, чтобы разрешить больше наборов символов и, при необходимости, включить спецификацию языка.
Поскольку первоначальные спецификации электронной почты и MIME включали предположение, что заголовки будут содержать только строгий US-ASCII, кодирование заголовка является полностью отдельной проблемой от кодирования MIME тела сообщения.
Формат:
=? <набор-символов> [* язык]? ? <текст>? =
будет либо Q для цитируемой печати, либо B для кодировки base64.Если сообщение кажется полным бредом, я предполагаю, что вы видите base64. И имя набора символов, и буква кодировки не чувствительны к регистру.
Итак, вы можете увидеть:
Тема: =? Utf-8? B? SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSB1bmRlcnN0b29kIHRoZSBleGFtcGxlLgo =? =
Или с добавленным идентификатором языка:
Тема: =? Utf-8 * en? B? SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSB1bmRlcnN0b29kIHRoZSBleGFtcGxlLgo =? =
Пример ручного декодирования:
$ echo "SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSB1bmRlcnN0b29kIHRoZSBleGFtcGxlLgo =" | base64 -d
Если вы можете это прочитать, значит, вы поняли этот пример.
Тот факт, что ваш существующий сценарий Procmail включает принудительную маркировку кодировок набора символов iso-8859-1
, US-ASCII
и UNKNOWN-8BIT
как windows-1251
, указывает на то, что ваша реальная проблема может быть неправильно маркированный символ кодирование. Другими словами:
- старый почтовый клиент выдает
windows-1251
кириллицей, не помечая их как таковые, возможно, также в заголовках - , электронное письмо проходит через почтовый сервер, который либо не сообщает должным образом о том, что он может правильно обрабатывать 8-битные почтовые кодировки, либо ревностно пытается обеспечить маркировку всех наборов символов, кроме простого US-ASCII.
В этой ситуации MTA необходимо закодировать и пометить 8-битные символы для передачи почты. Но если 8-битные символы не помечены, только исходный почтовый клиент знает наверняка, что это за набор символов на самом деле.
Проблема с маркировкой наборов символов постфактум состоит в том, что для идентификации набора символов может потребоваться понимание на человеческом уровне того, имеет ли контент смысл интерпретироваться как конкретный набор символов или нет. Таким образом, вы в конечном итоге будете использовать эвристику, которая иногда будет ошибочной.
Например, если вы получаете электронное письмо, которое на самом деле правильно закодировано в iso-8859-1
, ваш сценарий неправильно пометит его как windows-1251
, в результате чего любые символы с нордическим / западноевропейским акцентом будут отображаться как случайные не- толковая кириллица. Но если это реже, чем получение закодированных сообщений windows-1251
, ошибочно помеченных как iso-8859-1
, вы можете принять этот риск, и это нормально.
Я думаю, вам придется исследовать свои проблемные сообщения, чтобы выяснить, как на самом деле закодированы их заголовки Subject:
.Они:
- обычная без надписи
windows-1251
? - действительно действительный
base64
-encoded UTF-8? - или
windows-1251
, который был закодированbase64
и неправильно обозначен как UTF-8?
К сожалению, procmail
и его сопутствующий formail
может оказаться недостаточным для получения заголовка Subject:
в незакодированной форме. Они не поддерживаются с 2001 года, и даже их автор теперь предлагает перейти к чему-то другому.Но если вы хотите и дальше использовать procmail
, вам понадобится что-то вроде этого скрипта:
https://github.com/akkana/scripts/blob/master/decodemail.py
Я не делал значительных сценариев procmail
около 10 лет, поэтому приведенный ниже пример может быть неправильным или может быть лучший способ сделать это. Но, возможно, это полезно для объяснения того, как можно решить проблему …
Вам нужно сначала декодировать содержимое заголовка Subject:
и сохранить его в переменной:
: 0 ч
SUBJDECODED = | расшифровать почту.py Тема:
: 0 ч.
SUBJWASRAW = | formail -xSubject: | перекодировать windows-1251..UTF-8
Чтобы исправить неправильную маркировку кодировок, вам может потребоваться перекодировать набор символов из того, что он на самом деле есть, в UTF-8, используемый вашей системой:
SUBJWASWIN1251 = `echo" $ SUBJDECODED "| перекодировать windows-1251..UTF-8`
Если существует несколько возможных кодировок, возможно, вам придется создать несколько таких переменных.
Тогда можно сопоставить по любой версии темы:
: 0 * SUBJWASRAW ?? ваш-предмет-регулярное выражение-здесь { # Здесь предметом был необработанный windows-1251 без какой-либо кодировки.# Переменная преобразована в действительный UTF-8, используемый этой системой, # теперь заголовок можно переписать в удобной форме. # (В этом примере тема остается необработанной без метки UTF-8, # может быть приемлемым или неприемлемым для всего, что вы используете для просмотра электронной почты. # Но в современных почтовых клиентах, совместимых с RFC 6532 # в системе, которая использует UTF-8, это может быть нормально.) : 0 f | formail -i "Тема: $ SUBJWASRAW" } : 0 * SUBJWASWIN1251 ?? ваш-предмет-регулярное выражение-здесь { # regexp соответствует, поэтому мы знаем, что тема была windows-1251 # неправильно обозначен как UTF-8. Subject :.* Префикс
, поскольку переменные будут содержать только значение заголовкаSubject:
. Руководство пользователяГлава 6: Поддержка Unicode и не-ASCII
Глава 6. Поддержка Unicode и не-ASCII
6.1 Формат для печати в кавычках
6.2 Символы, отличные от ASCII в заголовках
6.3 Unicode и UTF-8
6.4 Поддержка UTF-8 в AspEmail
6.5 Допустимые значения CharSet
6.1 формат цитируемой печати
AspEmail может отправлять сообщения в алфавитах, отличных от US-ASCII. за счет поддержки формата «Цитата для печати». Этот формат описан в RFC-2045. Идея формата заключается в том, что символы с кодами меньше 33 и больше чем 126 представлены знаком "=", за которым следует двузначное шестнадцатеричное представление. ценности персонажа. Например, десятичное значение 12 (подача формы US-ASCII) представлен как = 0C , а десятичное значение 61 (US-ASCII "=") может быть представлено как = 3D .AspEmail кодирует тело сообщения в формате Quoted-Printable автоматически, если для свойства ContentTransferEncoding установлено значение строка "Quoted-Printable" (регистр букв не имеет значения). Вы также можете установить свойство Charset к соответствующему набору символов. Следующий фрагмент кода отправляет сообщение на русском языке:
<% @ codepage = 1251%>
<%
...
Почта.Кодировка = "Windows-1251"
Mail.Body = "-".
Mail.ContentTransferEncoding = "Quoted-Printable"
%>Директива <% @ codepage = 1251%> предписывает интерпретатор ASP для обработки жестко запрограммированных символов в сценарии в виде русских символов (1251 - русская кодовая страница). Как результат, свойство Body получит русскую строку Unicode.
6.2 символа не-ASCII в заголовках
Если вы хотите отправить сообщение с определенными заголовками, например, Тема: , To: или From: , содержащие символы, отличные от US-ASCII, следует использовать метод Mail.EncodeHeader для кодирования строки символов в соответствии с RFC 1522. Метод принимает один обязательный параметр, строку заголовка, и один необязательный параметр, набор символов, который по умолчанию равен « ISO-8859-1 ».Например:<% @ codepage = 1251%>
<%
Mail.Subject = Mail.EncodeHeader ("-", "Windows-1251")
Mail.FromName = Mail.EncodeHeader ("", "Windows-1251")
Mail.AddAddress "[email protected]", Mail.EncodeHeader ("")
%>6.3 Unicode и UTF-8
Из MSDN: "Юникод - это 16-битный стандарт кодировки символов фиксированной ширины, который охватывает практически все символы, обычно используемые на компьютерах сегодня.Это включает в себя большинство письменных языков мира, а также издательские персонажи, математические и технические символы и знаки препинания ".С Unicode.org: "Компьютеры ... хранят буквы и другие символы присвоение номера каждому. До изобретения Unicode существовало сотни различных систем кодирования для присвоения этих чисел. Ни одна кодировка не может содержать достаточно символов ... Unicode предоставляет уникальный номер для каждого символа, независимо от того, какая платформа, какая программа, на каком языке.«
Например, основная латинская буква «А» имеет шестнадцатеричный код 0041 (65), русский буква имеет код Hex 0416 (1046), а китайский иероглиф имеет код Hex 32A5 (12965).
UTF-8 (формат преобразования Unicode, 8-битная форма кодирования) рекомендуется формат, который будет использоваться для отправки данных на основе Unicode по сетям, в частности, через Интернет. UTF-8 представляет значение Unicode как последовательность из 1, 2 или 3 байтов.
Символы Юникода в диапазоне от 0000 до 007F кодируются просто как байты. 00 до 7F. Это означает, что файлы и строки, содержащие только 7-битный ASCII символы имеют одинаковую кодировку как в ASCII, так и в UTF-8. Следовательно, Unicode 0041 («A») в UTF-8 - это Hex 41.
Символы Юникода в диапазоне от 0080 до 07FF кодируются как последовательность из двух байтов. Например, Unicode 0416 () кодируется как Hex D0 96. Кодируются символы Unicode в диапазоне от Hex 0800 до FFFF. как последовательность из трех байтов.Например, Unicode 32A5 () кодируется как Hex E3 8A A5.
6.4 Поддержка UTF-8 в AspEmail
AspEmail 5.0 предлагает полную поддержку UTF-8 как в теле сообщения, так и в заголовках. Чтобы отправить сообщение в кодировке UTF-8, вы должны установить CharSet свойство к строке " UTF-8 " (регистр не имеет значения), и ContentTransferEncoding на « Quoted-Printable ».Вы также должны передать UTF-8 в качестве второго аргумента для EncodeHeader .В следующем примере кода демонстрируется использование UTF-8:
<%
'изменить на адрес вашего собственного SMTP-сервера
strHost = "smtp.myisp.net"'Включить UTF-8 -> Перевод Unicode для элементов формы
Session.CodePage = 65001 'Код UTF-8Если Запрос ("Отправить") "" То
Установите Mail = Server.CreateObject ("Persits.MailSender")
'введите действительный SMTP-хост
Mail.Host = strHostMail.From = "[email protected]" 'с адреса
Mail.FromName = Mail.EncodeHeader (Запрос ("FromName"), "utf-8")
Mail.AddAddress Request («Кому»)'тема сообщения
Mail.Subject = Mail.EncodeHeader (Запрос ("Тема"), "utf-8")'тело сообщения
Mail.Body = Request ("Body")'Параметры UTF-8
Почта.CharSet = "UTF-8"
Mail.ContentTransferEncoding = "Quoted-Printable"
Mail.Send 'отправить сообщение
Response.Write "Сообщение отправлено" & Request ("To")
Конец, если
%>
AspEmail: Unicode.asp
<ТЕЛО>