[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-ustroystvo-pk-i-seti-chto-takoe-kodirovki-simvolov-chem-otlichayutsya-ascii-utf-8-utf-16-grade-junior":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":22,"progress":23,"seo":24},221,"chto-takoe-kodirovki-simvolov-chem-otlichayutsya-ascii-utf-8-utf-16-grade-junior",7,"ustroystvo-pk-i-seti","Устройство ПК и сети","🖥️","Что такое кодировки символов? Чем отличаются ASCII, UTF-8, UTF-16? \u003C!-- grade: junior -->","Кодировка символов — это набор правил, определяющих, как символы (буквы, цифры, знаки) представляются в виде последовательности байтов в памяти компьютера.\n\n> Аналогия: кодировка — это словарь-переводчик между человеческими буквами и числами. ASCII — маленький англо-числовой словарь на 128 слов. Unicode — полная энциклопедия всех языков мира. А UTF-8 и UTF-16 — разные способы записать слова из этой энциклопедии на бумаге.\n\n### ASCII\n\n**ASCII (American Standard Code for Information Interchange):**\n+ 7-битная кодировка, 128 символов (0-127).\n+ Включает: латинские буквы (A-Z, a-z), цифры (0-9), знаки препинания, управляющие символы (перенос строки, табуляция).\n+ 1 символ = 1 байт.\n+ Не поддерживает кириллицу и большинство других алфавитов.\n\n### Unicode\n\n**Unicode** — универсальный стандарт, присваивающий уникальный номер (**code point**) каждому символу всех языков мира:\n+ Содержит более 150 000 символов.\n+ Code point записывается как `U+XXXX`, например: `U+0041` = 'A', `U+0410` = 'А' (кирилл.).\n+ Unicode — это **не кодировка**, а набор символов (character set). Кодировки UTF-8, UTF-16, UTF-32 определяют, как code points хранятся в байтах.\n\n### UTF-8\n\n**UTF-8 (Unicode Transformation Format, 8-bit):**\n+ Кодировка переменной длины: 1-4 байта на символ.\n+ Совместима с ASCII: символы 0-127 занимают 1 байт (те же значения, что в ASCII).\n+ Латиница — 1 байт, кириллица — 2 байта, иероглифы — 3 байта, эмодзи — 4 байта.\n+ Самая распространённая кодировка в Интернете (>98% веб-страниц).\n+ Используется по умолчанию в Linux, JSON, XML, HTML5.\n\n### UTF-16\n\n**UTF-16:**\n+ Кодировка переменной длины: 2 или 4 байта на символ.\n+ Большинство символов (включая кириллицу, латиницу, иероглифы) — 2 байта.\n+ Символы за пределами BMP (Basic Multilingual Plane), например эмодзи — 4 байта (суррогатная пара).\n+ **Используется внутри Java**: `String` и `char` основаны на UTF-16. `char` = 2 байта = один элемент UTF-16.\n\n### Сравнение\n\n| Свойство | ASCII | UTF-8 | UTF-16 |\n|----------|-------|-------|--------|\n| Размер символа | 1 байт | 1-4 байта | 2-4 байта |\n| Совместимость с ASCII | Да | Да | Нет |\n| Поддержка всех символов Unicode | Нет | Да | Да |\n| Эффективность для латиницы | Максимальная | Максимальная | Низкая (2 байта на символ) |\n| Эффективность для иероглифов | Не поддерживает | 3 байта | 2 байта |\n| Использование | Устаревший стандарт | Веб, Linux, JSON, XML | Java, Windows, .NET |\n\n### Работа с кодировками в Java\n\n```java\nString s = \"Привет\";\ns.length();                       \u002F\u002F 6 — количество char (UTF-16 единиц)\ns.codePointCount(0, s.length());  \u002F\u002F 6 — количество Unicode символов (code points)\ns.getBytes(\"UTF-8\").length;       \u002F\u002F 12 — 6 кириллических символов x 2 байта UTF-8\ns.getBytes(\"UTF-16\").length;      \u002F\u002F 14 — 6 x 2 + 2 (BOM)\n```\n\nВажный нюанс: для символов за пределами BMP (например, эмодзи) `String.length()` вернёт 2 (суррогатная пара из двух `char`), хотя это один символ. Поэтому для корректного подсчёта символов используйте `codePointCount()`.\n\nНачиная с Java 9, строки внутри JVM могут храниться в **Compact Strings**: если все символы входят в Latin-1 (1 байт), используется `byte[]` вместо `char[]`, экономя память вдвое для ASCII-строк.\n\n### Вывод\n\nASCII — базовая однобайтовая кодировка для латиницы. Unicode — универсальный набор символов, а UTF-8 и UTF-16 — способы его кодирования в байты. UTF-8 доминирует в вебе, UTF-16 используется внутри Java. Ключевой момент: `String.length()` в Java возвращает количество `char` (UTF-16 единиц), а не количество символов.\n\n> **На собеседовании:** junior-вопрос. Часто спрашивают: почему `\"Hello\".getBytes(\"UTF-8\").length` отличается от `\"Привет\".getBytes(\"UTF-8\").length`? Ответ: кириллица в UTF-8 занимает 2 байта на символ. Также важно понимать ловушку с `length()` для эмодзи и суррогатных пар.","","junior",[15,16,17,18,19,20,21],"Unicode","кодировки","UTF-16","UTF-8","computer-fundamentals","ASCII","Compact Strings",[],null,{"title":25,"description":26,"ogTitle":27,"ogDescription":28,"keywords":29,"schemaAnswer":35,"featuredSnippetReady":36},"Кодировки ASCII, UTF-8, UTF-16 — отличия и Java String — Gymterview","ASCII — 128 символов, 1 байт. UTF-8 — переменная длина 1–4 байта, совместима с ASCII. UTF-16 — 2–4 байта, используется внутри Java String. Compact Strings.","ASCII vs UTF-8 vs UTF-16 — какую кодировку использует Java","ASCII — 128 символов. UTF-8 — 1–4 байта, стандарт интернета. UTF-16 — 2–4 байта, используется в Java String. С Java 9 — Compact Strings для экономии памяти.",[30,31,32,33,34],"кодировки символов ASCII UTF-8 UTF-16","Unicode code point","Java String UTF-16","Compact Strings Java 9","кириллица UTF-8","Кодировка определяет, как символы представляются в байтах. ASCII — 7 бит, 128 символов, только латиница. UTF-8 — переменная длина (1–4 байта), совместима с ASCII, стандарт интернета. UTF-16 — 2 или 4 байта, используется внутри Java (String, char = 2 байта). Unicode — набор символов с уникальными code points, UTF-8\u002F16 — способы их хранения.",true]