сколько байт требуется на один символ ?
Для ответа на ваш вопрос нужно определиться, что такое символ. Если это аглицкая буква, то 1 байта за глаза хватит. Если же символ — это китайский иероглиф, то минимум 2 байта нужно. Если же смотреть все буквы всех ныне используемых алфавитов, то я даже и не знаю. Дохрена!
Антонa КузнецовМыслитель (8117) 13 лет назад
Ну это легко подсчитать по формуле. но вот откуда взять точное число всех алфавитов? Ведь если ещё взять мёртвые языки. Думаю там на килобайт потянет 0_о.
ЧАВ Высший разум (171149) Про мёртвые языки я вообще молчу! Кто бы посчитал ныне используемые. Греческий, латиница, кириллица, арабский, иврит, грузинский, армянский, деванагари, тайский, кхмерский, эфиопский и ещё ХЗ сколько! Иероглифы отдельно считать надо.
ЖурналистГуру (2964) 13 лет назад
в ASCII таблице , естественно
ЧАВ Высший разум (171149) Стандартный ASCII — 128 символов, 7 бит на символ. Английские прописные и строчные, цифры и некоторые знаки типа ! » # $ % & ‘ ( ) * + ,— . /
Остальные ответы
1 байт в двоичной кодировки
1 бит это 1 символ в байте 8 битов. осталось посчитать
Brad9agaОракул (62591) 7 лет назад
Зависит от шрифта, и программы в которой Вы печатаете. Кодировка требует тем больше бит, чем больше максимальное количество символов. В кириллице 6 бит на 1 букву.
Источник: Информатика, где то за 9 класс.
ЖурналистГуру (2964) 13 лет назад
я спрашивал про в ASCII таблицы,
сколько там байт на один символ ?
Антонa Кузнецов Мыслитель (8117) Я понял. Минутку, мне нужно найти эту книгу.
ASCII — не 256 символов, а 128 — нет такой вещи как «расширенный ASCII» — это (ошибочный) жаргон далёких времён 1989-1997
Есть «старые» кодировки» и есть Unicode и ответ — разный:
ASCII
ASCII (английские буквы, точка, запятая. ) — 1 байт
Эти же символы в Unicode:
— 1 байт в UTF-8
— 16 бит значение в UTF-16 (UCS-2)
Европейские языки
(немецкий, русский, польский. )
«старые кодировки: символ — 1 байт (русский, немецкий, ..)
Это таблица в 256 знаков, где первые 128 — ASCII, а следующие 128, в зависимости от кодировки:
— кодировка Latin1 (1252 под Windows) — Западная Европа- там немецкие, французские, итальянские буквы в той части таблицы, что после 128
— 1250 — польские, чешские
— 1251 — кириллица там
— ..
— UTF-16 — все символы, будь то русский/немецкий/японский —
16 бит значение
— UTF-8:
— акцентированные европейские и кириллица — 2 байта
Японские/китайские/корейские — 3 байта в UTF-8, 16бит значение в UTF-16
если не-Unicode то — 2 байта, правда, некоторые японские бывают 1 байт под Windows, а другие — 3 байта под Unix
UTF-16
UTF-16 (англ. Unicode Transformation Format ) в информатике — один из способов кодирования символов из Unicode в виде последовательности 16-битных слов. Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и U+E000..U+10FFFF (всего 1 112 064 штук). При этом каждый символ записывается одним или двумя словами (суррогатная пара).
Кодировка UTF-16 описана в приложении Q к международному стандарту ISO/IEC 10646, а также ей посвящён IETF RFC 2781 «UTF-16, an encoding of ISO 10646».
История появления
Первая версия Юникода (1991 г.) представляла собой 16-битную кодировку с фиксированной шириной символа; общее число разных символов было 2 16 (65 536). Во второй версии Юникода (1996 г.) было решено значительно расширить кодовую область; для сохранения совместимости с теми системами, где уже был реализован 16-битный Юникод, и была создана UTF-16. Область 0xD800—0xDFFF, отведённая для суррогатных пар, ранее принадлежала к области «символов для частного использования».
Поскольку в UTF-16 можно отобразить 2 20 +2 16 — 2048 (1 112 064) символов, то это число и было выбрано в качестве новой величины кодового пространства Юникода.
Принцип кодирования
| DC00 | … | DFFE | DFFF | |
|---|---|---|---|---|
| D800 | 010000 | … | 0103FE | 0103FF |
| D801 | 010400 | … | 0107FE | 0107FF |
| … | … | |||
| DBFF | 10FC00 | … | 10FFFE | |
В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от 0 до FFFF16). При этом можно кодировать символы Unicode в дипазонах 000016..D7FF16 и E00016..10FFFF16. Исключенный отсюда диапазон D80016..DFFF16 используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16-битными словами. Символы Unicode до FFFF16 включительно (исключая диапазон для суррогатов) записываются как есть 16-битным словом. Символы же в диапазоне 1000016..10FFFF16 (больше 16 бит) уже кодируются парой 16-битных слов. Для этого их код арифметически сдвигается до нуля (из него вычитается минимальное число 1000016). В результате получится значение от нуля до FFFFF16, которое занимает до 20 бит. Старшие 10 бит этого значения идут в лидирующее (первое) слово, а младшие 10 бит — в последующее (второе). При этом в обоих словах старшие 6 бит используются для обозначения суррогата. Биты с 11 по 15 имеют значения 110112, а 10-ый бит содержит 0 у лидирующего слова и 1 — у последующего. В связи с этим можно легко определить к чему относится каждое слово.
Порядок байт
Один символ кодировки UTF-16 представлен последовательностью двух байтов. Который из двух идёт впереди, старший или младший, зависит от порядка байтов. Систему, совместимую с процессорами x86, называют little endian , а с процессорами m68k и SPARC — big endian .
Для определения порядка байтов используется метка порядка байтов (англ. Byte order mark ). В начале текста записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов обратный, поскольку символа с кодом и U+FFFE в Юникоде нет. Так как в кодировке UTF-8 не используются значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий различать UTF-16 и UTF-8.
UTF-16LE и UTF-16ВE
Предусмотрена также возможность внешнего указания порядка байтов — для этого кодировка должна быть описана как UTF-16LE или UTF-16ВE (little-endian / big-endian), а не просто UTF-16. В этом случае метка порядка байтов (U+FEFF) не нужна.
UTF-16 в ОС Windows
Основная статья: Юникод в операционных системах Microsoft
В API Win32, распространённом в современных версиях операционной системы Microsoft Windows, имеется два способа представления текста: в форме традиционных 8-битных кодовых страниц и в виде UTF-16.
В файловых системах NTFS, а также FAT с поддержкой длинных имён, имена файлов записываются в UTF-16LE.
Примеры процедур
Примеры ниже записаны на псевдокоде и в них не учитывается маска порядка байт — они лишь показывают суть кодирования. Порядок байт — от младшего к старшему (Little-Endian, интеловский x86). Тип Word — двухбайтовое слово (16-битное беззнаковое целое), а тип UInt32 — 32-битное беззнаковое целое. Шестнадцатиричные значения начинаются со знака доллара «$».
Кодирование
В примере WriteWord() — условная процедура, которая пишет одно слово (при этом сдвигает внутренний указатель). Функция LoWord() возвращает младшее слово от 32-битного целого (старшие биты не глядя отбрасываются).
// Допустимые значения Code: $0000..$D7FF, $E000..$10FFFF. Procedure WriteUTF16Char(Code: UInt32) If (Code < $10000) Then WriteWord(LoWord(Code)) Else Code = Code - $10000 Var Lo10: Word = LoWord(Code And $3FF) Var Hi10: Word = LoWord(Code Shr 10) WriteWord($D800 Or Hi10) WriteWord($DC00 Or Lo10) End If End Procedure
Раскодирование
В примере ReadWord() читает слово из потока (сдвигая при этом внутренний указатель). Она же при необходимости может корректировать порядок байт. Функция WordToUInt32 расширяет двухбайтовое слово до четырёхбайтового беззнакового целого, заполняя старшие биты нулями. Error() прерывает выполнение (по сути исключение).
// В случае успеха возвращаются значения // в диапазонах $0000..$D7FF и $E000..$10FFFF. Function ReadUTF16Char: UInt32 Var Leading: Word // Лидирующее (первое) слово. Var Trailing: Word // Последующее (второе) слово. Leading = ReadWord(); If (Leading < $D800) Or (Leading >$DFFF) Then Return WordToUInt32(Leading) Else If (Leading >= $DC00) Then Error("Не допустимая кодовая последовательность.") Else Var Code: UInt32 Code = WordToUInt32(Leading And $3FF) Shl 10 Trailing = ReadWord() If ((Trailing < $DC00) Or (Trailing >$DFFF)) Then Error("Не допустимая кодовая последовательность.") Else Code = Code Or WordToUInt32(Trailing And $3FF) Return (Code + $10000) End If End If End Function
Ссылки
- Unicode Technical Note #12: Обработка UTF-16 (англ.)
- Unicode FAQ: В чём разница между UCS-2 и UTF-16? (англ.)
- RFC 2781: UTF-16, an encoding of ISO 10646
- Полное описание стандарта Unicode (англ.)
- ISO-10646-UTF-16 (Информация о конвертировании больших значений в два слова UTF-16)
| Кодировки символов | |||
|---|---|---|---|
| Основы → | алфавит • текст ( файл • данные ) • набор символов • конверсия | ||
| Исторические кодировки → | Докомп.: семафорная (Макарова) • Морзе • Бодо • МТК-2 | Комп.: 6 бит • УПП • RADIX-50 • EBCDIC ( ДКОИ-8 ) • КОИ-7 • ISO 646 | |
| совре- менное 8-битное представ- ление |
символы → | ASCII ( управляющие • печатные ) | не-ASCII ( псевдографика ) |
| 8бит. код.стр. | Разные → Кириллица: КОИ-8 • ГОСТ 19768-87 • MacCyrillic | ||
| ISO 8859 → | 1(лат.) 2 3 4 5(кир.) 6 7 8 9 10 11 12 13 14 15(€) 16 | ||
| Windows → | 1250 1251(кир.) 1252 1253 1254 1255 1256 1257 1258 | WGL4 | ||
| IBM&DOS → | 437 • 850 • 852 • 855 • 866 «альт.» • ( МИК ) • ( НИИ ЭВМ ) | ||
| Много- байтные |
Традиционные → | DBCS ( GB2312 ) • HTML | |
| Unicode → | UTF-16 • UTF-8 • список символов ( кириллица ) | ||
| Связанные темы → |
интерфейс пользователя • раскладка клавиатуры • локаль • перевод строки • шрифт • кракозябры • транслит • нестандартные шрифты • текст как изображение | Утилиты: iconv • recode | |
| Это заготовка статьи о компьютерах. Вы можете помочь проекту, исправив и дополнив её. Это примечание по возможности следует заменить более точным. |
- Юникод
Общее представление о Unicode, UTF-8, UTF-16 LE/BE, BOM
Unicode(далее юникод) — это стандарт, который определяет таблицу символов и способы машинного представления (кодировки) этих символов в байтах.
Таблица символов ставит каждому символу в соответствие значение в виде U+[число в шестнадцатиричной СС]. Например, U+0053 соответствует заглавной латинской букве S. Таблица unicode
Unicode содержит 1,114,112 символов в диапазоне от 0 до 10FFFF. Все символы разделены на 17 групп от группы 0 до 16.
Существуют следующие байтовые представления символов юникода UTF-8, UTF-16(UTF-16 LE или UTF-16 BE), UTF-32(UTF-32 LE или UTF-32 BE).
Каждая кодировка устанавливает свои правила преобразования символа юникод в байты и использует разное количество байтов для представления разных символов.
Например, кодировка UTF-8 использует от 1 до 4 байтов и позволяет покрыть все 1,114,112 символов юникода (потенциально даже больше символов). Первые 128 символов в таблице юникод совпадают с 128 символами из кодовой таблицы ASCII, и UTF-8 кодирует эти 128 символов так же, как и ASCII. В качестве байтового представления используется просто порядковый номер в таблице.
Ниже кусок юникод-таблицы, первые 128 символов, в ней представлены порядковый номер и символ
чтобы получить порядковый номер(U+xxxx) в таблице нужно к числу строки(0000, 0010, 0020, …, 0070) добавить номер столбца(0, 1, 2, …, F), например ‘K’ — это ‘U+004B’
порядковый номер в общем случае не является машинным представлением, но в случае первых 128 символов совпадает с байтовым кодом по версии ASCII и UTF-8
тут число не просто порядковый номер, а байтовое представление символа в памяти компьютера
кусок таблицы, всю можно посмотреть тут
Один символ кодировки UTF-16 представлен последовательностью двух байтов или двух пар байтов (т.е. 2 или 4 байта на символ). Получается, наименьшей единицей представления символа является 2 байта (называют “слово”). Который из двух байтов в слове идёт впереди, старший или младший, зависит от порядка байтов. Суффиксы BE и LE в названии кодировки указывают порядок. BE — big-endian — от старшего к младшему; LE — little-endian — от младшего к старшему.
Чтобы определить порядок байтов на основании самого файла, используется специальный юникод-символ U+FEFF, называемый BOM (Byte Order Mark), меткой последовательности байтов. Символ U+FEFF добавляется в начало текстового файла, считав который можно определить кодировку файла.
Как видно из таблицы
- UTF-8 c BOM записывает в начало файла метку U+FEFF в виде 3-х байтов EF BB BF
- UTF-16 BE c BOM записывает в начало файла метку U+FEFF в виде 2-х байтов FE FF
- UTF-16 LE c BOM записывает в начало файла метку U+FEFF в виде 2-х байтов FF FE
Согласно стандарту Encoding Standard, UTF-8 является самой подходящей кодировкой для обмена юникодом.
Unicode в операционных системах
Современные ОС более менее поддерживают юникод.
К примеру, ОС семейства Windows NT, а точнее с Windows 2000, поддерживают ввод и вывод символов юникод. Для байтового представления символов юникод используется UTF-16 LE. При этом Windows не ограничивает прикладные программы касательно кодирования текстовых файлов, позволяя им использовать как UTF-16 LE, так и UTF-16 BE посредством установки и последующей трактовки метки последовательности байтов. Однако внутренний формат Windows — это UTF-16 LE.
Unix-подобные ОС, в том числе GNU/Linux, BSD, OS X, используют для представления юникода кодировку UTF-8.
Почему для кодирования одного символа нужен именно 1 байт?
Почему для кодирования 1-го символа нужен именно 1 байт? Я прекрасно понимаю, что минимальная единица информации - 1 бит и чтобы выразить 255 символов в двоичном коде надо использовать 8 бит. И по таблице брать двоичный код и по нему находить нужный символ, но почему каждый символ обязательно занимает 1 байт? Зачем записывать число именно вот так 0000001 , а не просто 1 , тем самым заняв всего 1 бит информации и по таблице взять ему соответствующий символ.
Отслеживать
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
задан 1 авг 2018 в 17:23
Никита Антонов Никита Антонов
125 1 1 серебряный знак 9 9 бронзовых знаков
Байт - минимальная адресуемая единица информации. Хранить каждый символ меньше чем в одном байте неэффективно по скорости доступа. А для длительного хранения (при сохранении в файл, например) никто не мешает применить сжатие.
1 авг 2018 в 17:27
@insolor, Use the answer form, Luke!
– user207618
1 авг 2018 в 17:34
Символы не хранят в одном байте уже лет тридцать 🙂
1 авг 2018 в 17:36
А вообще теоретически использовать один бит не разрешает, только вот 11111111 — это один символ (число 255) или восемь символов 1 ? Придётся добавлять дополнительную информацию, поясняющую, как правильно интерпретировать эти единицы. Ну и да, использовать число битов меньшее чем «минимальная адресуемая единица информации» банально неудобно, ибо именно под восьмибитный байт спроектированы все современные компьютеры
1 авг 2018 в 17:39
@andreymal, о спасибо большое! Теперь дошло! Только вот еще вопрос тоесть большие последовательности в зависимости от кодировки делятся на определенное количество байт (1, 2 и тд) и уже по таблице находится определенные символы ?
1 авг 2018 в 17:42
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Не обязательно 1 ..есть кодировки (например utf-16, utf-32 ) где символы по 2 , по 4 байта. тут еще многое зависит от количества кодируемых символов. не всегда хватает 256 вариантов. часто нужно больше.то есть битность напрямую зависит от числа символов в таблице символов. Если влезть в ассемблер, то можно сделать свою таблицу символов. проблема будет только в том что твою кодировку будет понимать только твоя программа. А так просто принятый стандарт, и все. по поводу же адресации, да - опять же стандарт. хотя есть системы , которые работают и 9-ю битами ( старые советские системы связи) , где 9-й бит был или контрольным или знак передавал.
Отслеживать
ответ дан 1 авг 2018 в 17:35
Сергей Петрашко Сергей Петрашко
1,493 7 7 серебряных знаков 15 15 бронзовых знаков
Я наверное неправильно задал вопрос имею в виду почему все символы имеют 1 и тот же размер(тоесть 2 байта или 1), а не так чтобы 1 символ весит больше, а другой меньше, если все равно старшие разряды заполнены нулями (00000001 к примеру)
1 авг 2018 в 17:38
@НикитаАнтонов в кодировке UTF-8 длина одного символа может быть 1, 2, 3 или 4 байта 🙂 А использовать число бит, не кратное восьми, неудобно из-за архитектуры современных компьютеров, заточенных именно на 8 бит
1 авг 2018 в 17:40
будут проблемы с синхронизацией. такая проблема есть в азбуке морзе. то есть трудно понять где закончился один символ и начался второй. поэтому и принято использовать такие битности.