Укажите в байтах размер файла utf 8 в ответе слово байт писать не нужно
Проблема, вызванная китайцем, занимает несколько байтов в UTF-8.
Что такое бит, байт, слово, КБ, МБ
Немного: «Бит» - это наименьшая единица данных в электронном компьютере. Состояние каждого бита может быть только 0 или 1 。
байт: 8 двоичных разрядов образуют 1 «Байт», Это основная единица измерения места для хранения.
В одном байте может храниться одна английская буква или половина китайского символа. Другими словами, один китайский символ занимает 2 байта памяти.
2 в 4-й степени = 16
2 в 10-й степени = 1024
2 в 16 степени = 65536
Сколько байтов занимает целое число Java?
ответ: 1 байт занимает 8 бит, 4 байта, всего 32 бита
Можно ли сохранить китайский иероглиф в переменной типа char? Почему?
В языке C тип char занимает 1 байт, а man - 2 байта, поэтому его нельзя сохранить.
В Java тип char занимает 2 байта, а Java по умолчанию использует кодировку Unicode, код Unicode составляет 16 бит, поэтому код Unicode занимает два байта. , Как китайские символы, так и английские буквы в Java выражаются в Unicode. так что, В Java переменная типа char может хранить китайский символ. 。
Тип и байт соответствуют следующим образом
byte 1
short 2
char 2
int 4
float 4
double 8
Означает ли utf-8 китайский, что китайский символ занимает три байта в длину?
Это хороший вопрос. Начнем с кодировки символов.
1、 код ascii : Американцы сначала закодировали свои английские символы, это самый ранний код ascii, Используйте младшие 7 бит байта для представления 128 символов на английском языке, а верхний 1 бит равномерно равен 0 ;
2、 ISO-8859-1 : Позже европейцы выяснили, что Нима, вам достаточно 128 знаков. Например, в моем благородном французском алфавите есть фонетические символы. Как вы это различаете? Ну, давайте включим высший, поэтому в Европе обычно используется целая буква Раздел закодирован, Может представлять до 256 бит , Европейцы и американцы просто хотят идти прямо, используя меньше символов и меньше цифр для кодирования;
4. Что еще более неприятно, так это то, что после того, как высокотехнологичный компьютер Нимы был представлен в Китае, китайцы обнаружили, что у нас более 100 000 китайских иероглифов, а 256 символов в Европе и Америке недостаточно. Так изобрели GB2312 эти коды китайских символов обычно используют 2 байта для представления большинства распространенных китайских символов. , Он может представлять не более 65536 китайских иероглифов, поэтому нетрудно понять, что некоторые китайские символы можно найти в словаре Синьхуа, но если вы не обработаете их на компьютере, вы не сможете их отобразить.
5. Каждый набор символов используется для кодирования, как унифицирован мир? Русские разослали китайцам электронные письма: коды символов на обеих сторонах различаются, а дисплей Nima искажен. Ради унификации был изобретен юникод, в который были включены все символы мира. , Каждому символу дается уникальный код, теперь Unicode может содержать более 1 миллиона символов, код каждого символа отличается, на этот раз может быть унифицирован, все языки могут взаимодействовать друг с другом, веб-страница может отображать страны одновременно Текст.
7. С появлением Интернета, чтобы отображать различные символы на веб-странице, она должна быть унифицированной, дорогая. utf-8 - одна из наиболее важных реализаций Unicode. Также есть utf-16, utf-32 и др. UTF-8 - это не кодировка с фиксированной длиной слова, а метод кодирования с переменной длиной , Он может использовать от 1 до 4 байтов для представления символа, а длина байта зависит от разных символов. Это более продуманный дизайн, Если первый бит байта равен 0, тогда сам байт является символом; если первый бит равен 1, сколько единиц подряд идет, это означает, сколько байтов занимает текущий символ 。
8. Обратите внимание, что кодировка символов Unicode и представление кодировки хранилища utf-8 различаются. Например, код Unicode для "strict" - 4E25, а кодировка UTF-8 - E4B8A5. Как объясняется в этом 7, кодировка UTF-8 рассматривается не только В дополнение к кодированию также учитывается хранение. E4B8A5 вставляется в 4E25 на основе сохраненных идентификационных кодов. к
9. UTF-8 использует от одного до четырех байтов для кодирования каждого символа. 128 символов ASCII (диапазон Unicode от U + 0000 до U + 007F) только один байт, латиница, греческий, кириллица, армянский, иврит, арабский, сирийский с диакритическими знаками Для текстовых и мальдивских языков (диапазон Unicode от U + 0080 до U + 07FF) требуется два байта, другие символы в базовой многоязычной плоскости (BMP) (CJK относится к этой категории - примечание Qieqie) используют три байта, другие Для символов вспомогательной плоскости Unicode используется четырехбайтовая кодировка. 10. Наконец, отвечая на ваш вопрос, условно, китайские символы занимают несколько байтов в utf-8, обычно 3 байта, и наиболее распространенный метод кодирования - 1110xxxx 10xxxxxx 10xxxxxx.
Краткое введение в несколько форматов кодирования
Код ASCII
Любой, кто изучал компьютер, знает код ASCII, Всего 128 , Выраженные младшими 7 битами байта, 0 ~ 31 - это управляющие символы, такие как перевод строки, возврат каретки и т.д .; 32 ~ 126 - это печатные символы, которые можно вводить с клавиатуры и отображать.
ISO-8859-1
128 символов явно недостаточно, поэтому организация ISO разработала серию стандартов на основе кода ASCII для расширения кодировки ASCII. Это ISO-8859-1 ~ ISO-8859-15, из которых ISO-8859-1 охватывает Он имеет наиболее широко используемые символы в большинстве западноевропейских языков. ISO-8859-1 по-прежнему является однобайтовой кодировкой, Он может представлять в общей сложности 256 символов. 。
GB2312
Его полное название - «Базовый набор кодированных символов китайских иероглифов для обмена информацией». Это двухбайтовая кодировка. Общий диапазон кодирования составляет A1-F7. Среди них A1-A9 - это области символов, которые содержат в общей сложности 682 символа, начиная с B0- F7 - это область китайских иероглифов, которая содержит 6763 китайских символа.
GBK
Полное название - «Спецификация расширения внутреннего кода китайских иероглифов», которая представляет собой новую спецификацию внутреннего кода китайских иероглифов, сформулированную Государственным бюро технического надзора для windows95. Похоже, что она расширяет GB2312 и добавляет больше китайских символов. Его диапазон кодирования составляет 8140 ~ FEFE ( Удалить XX7F) Всего 23940 кодовых точек, которые могут представлять 21003 китайских символа. Кодировка совместима с GB2312, что означает, что китайские символы, закодированные с помощью GB2312, могут быть декодированы с помощью GBK. , И не будет искаженных символов.
Кодировка символов GBK: Двухбайтовое представление, то есть как китайские, так и английские символы представлены двухбайтовыми , Просто чтобы отличить китайца, высшая позиция выставлена на 1.
Полное название - «Набор символов китайской кодировки для обмена информацией», который является обязательным стандартом в нашей стране. Он может быть однобайтовым, двухбайтовым или четырехбайтовым. Его кодировка совместима с кодировкой GB2312. Хотя это национальный стандарт, на самом деле это В системе приложений он не используется широко.
UTF-8
UTF-8, UTF-16 и UTF-32 предназначены для Метод кодирования символов Unicode, удобный для передачи и хранения 。
Если для единообразного представления символа используются два байта, хотя это очень просто и удобно для представления, у него также есть свои недостатки. Большая часть символов может быть представлена одним байтом. Теперь для его представления требуется два байта, а пространство для хранения увеличивается в несколько раз. раз В сегодняшней сети пропускная способность по-прежнему очень ограничена, это увеличивает трафик передачи сети, и в этом нет необходимости. А UTF-8 использует технологию переменной длины, и каждая область кода имеет разную длину кода. Различные типы символов могут состоять из 1 ~ 6 байтов.
Позвольте мне сначала поговорить о UTF-8. С ростом популярности Unicode, независимо от того, что вы делаете, поддержка Unicode будет тенденцией, даже если вы никогда не воспользуетесь им, но это не очень хорошо для западных стран, потому что В предыдущем наборе символов ASCII для символа требуется только один байт, но теперь английская буква в Unicode также требует двух байтов. Если вам нужно передать и сохранить, это будет тратить половину пространства или трафика, поэтому я придумал изменение Метод длинного кодирования - UTF-8. Он использует только один байт для кодирования символов в наборе символов ASCII, в то время как другие символы кодируются в двух, трех и четырех байтах в соответствии с определенными правилами. , Особые правила:
Кодировка Unicode (шестнадцатеричная) Поток байтов UTF-8 (двоичный)
000000 - 00007F 0xxxxxxx
000080 - 0007FF 110xxxxx 10xxxxxx
000800 - 00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8 имеет следующие правила кодирования:
Если байт начинается с 11, количество последовательных единиц подразумевает количество байтов этого символа. , Например: 110xxxxx означает, что это первый байт двухбайтового символа UTF-8.
Если байт начинается с 10, это означает, что это не первый байт, и вам нужно ждать, чтобы получить первый байт текущего символа.
UTF-16
Говоря об UTF, необходимо упомянуть Unicode (универсальный код) .ISO пытается создать новый суперязыковый словарь, с помощью которого все языки мира могут переводить друг друга. Вы можете себе представить, насколько сложен этот словарь - подробные характеристики Unicode можно найти в соответствующих документах. Юникод является основой Java и XML. Форма хранения Юникода в компьютере подробно описана ниже.
UTF-16 конкретно определяет метод доступа к символам Unicode на компьютере. UTF-16 использует два байта для представления формата преобразования Unicode. , Это метод представления фиксированной длины, Независимо от того, какой символ может быть представлен двумя байтами, два байта составляют 16 бит, поэтому он называется UTF-16. , UTF-16 очень удобен для представления символов. Каждые два байта представляют символ. Это значительно упрощает работу со строками. Это также очень важная причина, по которой Java использует UTF-16 в качестве формата хранения символов в памяти.
Unicode
В мире существует множество методов кодирования, и одно и то же двоичное число можно интерпретировать как разные символы. Поэтому, если вы хотите открыть текстовый файл, вы должны знать его метод кодирования, иначе он будет искажен, если он будет интерпретирован с неправильным методом кодирования. , Почему электронные письма часто выглядят искаженными? Это потому, что метод кодирования, используемый отправителем и получателем, отличается.
Вполне возможно, что если есть какой-то код, в него будут включены все символы мира. Каждому символу присваивается уникальный код, тогда искаженная проблема исчезнет. Это Unicode, как следует из названия, это кодировка всех символов.
Проблема Unicode
нужно знать, Юникод - это просто набор символов. Он определяет только двоичный код символа, но не указывает, как этот двоичный код должен храниться.
Например, юникод китайского символа «Ян» - это шестнадцатеричное число 4E25, которое преобразуется в двоичное число с 15 битами (100111000100101), что означает, что для представления этого символа требуется не менее 2 байтов. Представляет другие символы большего размера, для которых может потребоваться 3 или 4 байта или даже больше.
Здесь есть две серьезные проблемы,
Первый вопрос , Как мы можем отличить Unicode от ASCII? Как компьютер узнает, что три байта представляют собой символ, а не три символа по отдельности?
Второй вопрос , Мы уже знаем, что английские буквы представлены только одним байтом. Если Unicode предусматривает единообразие, каждый символ представлен тремя или четырьмя байтами. Тогда перед каждой английской буквой должно быть два или три байта, которые равны 0, что является большой тратой памяти. Таким образом, размер текстового файла будет в два или три раза больше, что недопустимо.
Результат их: 1) Есть несколько способов хранения Unicode , Это означает, что существует множество различных двоичных форматов, которые можно использовать для представления Unicode., 2) Юникод нельзя продвигать долго до появления Интернета.
Популярность Интернета настоятельно требует единого метода кодирования. UTF-8 - наиболее широко используемая реализация Unicode в Интернете. Другие методы реализации включают UTF-16 (символы представлены двумя или четырьмя байтами) и UTF-32 (символы представлены четырьмя байтами) , Но в основном не используется в Интернете. Повторюсь, здесь связь заключается в том, что UTF-8 является одной из реализаций Unicode.
Одной из самых больших особенностей UTF-8 является то, что это метод кодирования переменной длины. Он может использовать от 1 до 4 байтов для представления символа, а длина байта зависит от разных символов.
Правила кодировки UTF-8 очень простые, их всего два:
1) Для однобайтовых символов первый бит байта установлен в 0, а следующие 7 битов представляют собой код Юникода этого символа. Следовательно, для английских букв кодировка UTF-8 и код ASCII одинаковы.
2) Для n-байтовых символов (n> 1) все первые n битов первого байта устанавливаются на 1, n + 1-й бит устанавливается на 0, а первые два бита следующих байтов устанавливаются на 10. Остальные не упомянутые двоичные биты - это все коды Unicode этого символа.
Возвращаясь к вопросу: сколько байтов занимает кодировка UTF-8?
Два байта: латинский, греческий, кириллица, армянский, иврит, арабский, сирийский с дополнительными символами, а другие буквы требуют двухбайтовой кодировки
3 байта: в основном эквивалент GBK, содержащий более 21000 китайских символов
4 байта: в супербольшом наборе символов CJK содержится более 50 000 китайских символов.
Номер utf8 занимает 1 байт
Английская буква utf8 занимает 1 байт
Некоторые китайские символы занимают 3 байта каждый, а большинство - 4 байта.
Занимает диапазон в 3 байта
[java] view plain copy
U + 2E80-U + 2EF3: 0xE2 0xBA 0x80-0xE2 0xBB 0xB3 Всего 115
U + 2F00-U + 2FD5: 0xE2 0xBC 0x80-0xE2 0xBF 0x95 Всего 213
U + 3005-U + 3029: 0xE3 0x80 0x85-0xE3 0x80 0xA9 Всего 36
U + 4E00-U + FA6A: 0xE4 0xB8 0x80-0xEF 0xA9 0xAA 44138 всего
U + FA70-U + FAD9: 0xEF 0xA9 0xB0-0xEF 0xAB 0x99 Всего 105
Занимает диапазон в 4 байта
[java] view plain copy
U + 20000-U + 2FA1D: 0xF0 0xA0 0x80 0x80-0xF0 0xAF 0xA8 0x9D 64029 итого
Зачем мне UTF-8, если у меня есть GBK
Версия UTF8: поддерживает китайский и английский, а английская система также может отображать китайский
Версия GBK: поддерживает только китайский язык, китайские веб-сайты в Китае обычно используют эту
Характеристики кодировки текста GBK и UTF-8:
Кодировка символов GBK выражается двойными байтами, то есть китайские и английские символы выражаются двойными байтами. , Просто чтобы отличить китайца, высшая позиция выставлена на 1.
Что касается Кодировка UTF-8 - это многобайтовая кодировка, используемая для определения международных символов. Она использует 8 бит (т. Е. Один байт) для английского языка и 24 бита (три байта) для китайского кодирования. , Для форумов с большим количеством английских символов используйте UTF-8 для экономии места.
Разница между кодировкой текста GBK и UTF-8:
GBK содержит все китайские иероглифы;
UTF-8 содержит символы, которые должны использовать все страны мира.
GBK - это стандарт, совместимый с GB2312 после расширения на основе национального стандарта GB2312; (это не похоже на национальный стандарт)
Текст в кодировке UTF-8 может отображаться в браузерах, поддерживающих набор символов UTF8 в разных странах. 。
Например, если это кодировка UTF8, китайский язык также может отображаться в английском IE иностранцев без необходимости загрузки пакета поддержки китайского языка IE.
Поэтому для форумов с большим количеством английского каждый символ занимает 2 байта при использовании GBK, но только один байт при использовании UTF-8.
Хотя версия UTF-8 имеет хорошую международную совместимость, китайская версия требует на 50% больше места для хранения базы данных, чем версия GBK / BIG5. Поэтому это не рекомендуется и только для пользователей с особыми требованиями к международной совместимости.
Короче говоря, кодировка кодировки GBK создается на основе национальных условий Китая и несовместима на международной арене. Вот почему большинство веб-страниц используют кодировку UTF-8 вместо GBK.
Для ответа на ваш вопрос нужно определиться, что такое символ. Если это аглицкая буква, то 1 байта за глаза хватит. Если же символ - это китайский иероглиф, то минимум 2 байта нужно. Если же смотреть все буквы всех ныне используемых алфавитов, то я даже и не знаю. Дохрена!
Ну это легко подсчитать по формуле. но вот откуда взять точное число всех алфавитов? Ведь если ещё взять мёртвые языки. Думаю там на килобайт потянет 0_о.
ЧАВ Высший разум (171124) Про мёртвые языки я вообще молчу! Кто бы посчитал ныне используемые. Греческий, латиница, кириллица, арабский, иврит, грузинский, армянский, деванагари, тайский, кхмерский, эфиопский и ещё ХЗ сколько! Иероглифы отдельно считать надо.
Зависит от шрифта, и программы в которой Вы печатаете. Кодировка требует тем больше бит, чем больше максимальное количество символов. В кириллице 6 бит на 1 букву.
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
Задание 1 № 10866
В кодировке UTF-16 каждый символ кодируется 16 битами. Влад написал текст (в нём нет лишних пробелов):
«Мята, тыква, огурец, артишок, патиссон, картофель — овощи».
Ученик вычеркнул из списка название одного из овощей. Заодно он вычеркнул ставшие лишними запятые и пробелы — два пробела не должны идти подряд.
При этом размер нового предложения в данной кодировке оказался на 22 байта меньше, чем размер исходного предложения. Напишите в ответе вычеркнутое название овоща.
Поскольку один символ кодируется двумя байтами, из текста удалили 11 символов. Заметим, что лишние запятая и пробел занимают четыре байта. Значит, название овоща, которое удалили из списка, должно состоять из 9 букв, поскольку (22 − 4) : 2 = 9 символов. Из всего списка только одно название овоща состоит из 9 букв — картофель.
Задание 1 № 10867
В кодировке UTF-16 каждый символ кодируется 16 битами. Илья написал текст (в нём нет лишних пробелов):
«айва, хурма, яблоко, гуарана, апельсин, мангостан — фрукты».
Ученик вычеркнул из списка название одного из фруктов. Заодно он вычеркнул ставшие лишними запятые и пробелы — два пробела не должны идти подряд.
При этом размер нового предложения в данной кодировке оказался на 20 байт меньше, чем размер исходного предложения. Напишите в ответе вычеркнутое название фрукта.
Поскольку один символ кодируется двумя байтами, из текста удалили 10 символов. Заметим, что лишние запятая и пробел занимают четыре байта. Значит, название фрукта, которое удалили из списка, должно состоять из 8 букв, поскольку (20 − 4) : 2 = 8 символов. Из всего списка только одно название фрукта состоит из 8 букв — апельсин.
Задание 1 № 12850
В одной из кодировок Unicode каждый символ кодируется 16 битами. При подготовке реферата по биологии Вова написал следующий текст (в нём нет лишних пробелов).
«Як, тар, лама, окапи, пекари, бегемот, антилопа, бабирусса, бородавочник относятся к диким парнокопытным животным».
Затем Вова вычеркнул из списка название одного из животных. Заодно он вычеркнул ставшие лишними запятые и пробелы — два пробела не должны идти подряд. При этом размер нового предложения в данной кодировке оказался на 16 байт меньше, чем размер исходного предложения. Напишите в ответе вычеркнутое название животного.
Поскольку один символ кодируется двумя байтами, из текста удалили 8 символов. Заметим, что лишние запятая и пробел занимают четыре байта. Значит, название животного, которое удалили из списка, должно состоять из шести букв, поскольку (16 − 4) : 2 = 6 символов. Из всего списка только одно название животного состоит из 6 букв — пекари.
4 байта: в супербольшом наборе символов CJK содержится более 50 000 китайских символов.
Номер utf8 занимает 1 байт
Английская буква utf8 занимает 1 байт
Некоторые китайские символы занимают 3 байта каждый, а большинство - 4 байта.
Занимает диапазон в 3 байта
U + 2E80-U + 2EF3: 0xE2 0xBA 0x80-0xE2 0xBB 0xB3 всего 115
U + 2F00-U + 2FD5: 0xE2 0xBC 0x80-0xE2 0xBF 0x95 Всего 213
U + 3005-U + 3029: 0xE3 0x80 0x85-0xE3 0x80 0xA9 всего 36
U + 4E00-U + FA6A: 0xE4 0xB8 0x80-0xEF 0xA9 0xAA Всего 44 138
U + FA70-U + FAD9: 0xEF 0xA9 0xB0-0xEF 0xAB 0x99 Всего 105
Занимает диапазон в 4 байта
продлить:
Мы знаем, что в компьютере вся информация, наконец, представлена в виде двоичной строки. Каждый двоичный бит (бит) имеет два состояния, 0 и 1, поэтому восемь двоичных битов можно объединить в 256 состояний, которые называются байтом. Другими словами, байт может использоваться для представления всего 256 различных состояний, и каждое состояние соответствует символу, который составляет 256 символов, в диапазоне от 0000000 до 11111111.
В 1960-х годах Соединенные Штаты сформулировали набор кодов символов для единообразного регулирования отношений между английскими символами и двоичными цифрами. Это называется кодом ASCII и используется до сих пор.
Код ASCII определяет всего 128 символов.Например, пробел равен 32 (двоичный код 00100000), а заглавная буква A - 65 (двоичный код 01000001). Эти 128 символов (включая 32 управляющих символа, которые не могут быть распечатаны) занимают только последние 7 бит байта, а первый бит всегда определяется как 0.
2. Кодирование, отличное от ASCII.
Английская кодировка из 128 символов достаточно, но для других языков 128 символов недостаточно. Например, во французском языке, если над буквой есть фонетический символ, он не может быть представлен кодом ASCII. Поэтому некоторые европейские страны решили использовать старший бит бездействующего байта для программирования нового символа. Например, код é на французском языке - 130 (двоичный код 10000010). Таким образом, система кодирования, используемая в этих европейских странах, может представлять до 256 символов.
Что касается шрифтов азиатских стран, то здесь используется больше символов, насчитывающих до 100 000 китайских иероглифов. Один байт может представлять только 256 видов символов, что явно недостаточно.Вы должны использовать несколько байтов для представления одного символа. Например, обычным методом кодирования для упрощенного китайского языка является GB2312, который использует два байта для представления китайского символа, поэтому теоретически он может представлять до 256x256 = 65536 символов.
Вопрос о китайской кодировке необходимо обсудить в специальной статье, которая не освещена в этой заметке. Здесь только указано, что, хотя для представления символа используется несколько байтов, китайская кодировка символов типа GB не имеет ничего общего с Unicode и UTF-8 ниже.
Как упоминалось в предыдущем разделе, в мире существует множество методов кодирования, и одно и то же двоичное число можно интерпретировать как разные символы. Следовательно, если вы хотите открыть текстовый файл, вы должны знать его метод кодирования, иначе будут отображаться искаженные символы, если вы декодируете его с помощью неправильного метода кодирования. Почему электронные письма часто выглядят искаженными? Это потому, что метод кодирования, используемый отправителем и получателем, отличается.
Возможно, что если есть код, то будут включены все символы мира. Каждому символу присваивается уникальный код, тогда искаженная проблема исчезнет. Это Unicode, как следует из названия, это кодировка всех символов.
4. Проблема Unicode
Следует отметить, что Unicode - это только набор символов, он только определяет двоичный код символа, но не указывает, как этот двоичный код должен храниться.
Например, юникод китайского символа «Ян» - это шестнадцатеричное число 4E25, которое преобразуется в двоичное число с 15 битами (100111000100101), что означает, что для представления этого символа требуется не менее 2 байтов. Представляет другие символы большего размера, для которых может потребоваться 3 или 4 байта или даже больше.
Здесь есть две серьезные проблемы: первая - как отличить Unicode от ASCII? Как компьютер узнает, что три байта представляют собой символ, а не три символа по отдельности? Вторая проблема заключается в том, что мы уже знаем, что английские буквы представлены только одним байтом.Если Unicode предусматривает, что каждый символ представлен тремя или четырьмя байтами, перед каждой английской буквой должно стоять два. До трех байтов равно 0, что является огромной тратой памяти. Поэтому размер текстового файла будет в два или три раза больше, что недопустимо.
Результатом этого является: 1) Существует несколько методов хранения Unicode, что означает, что существует множество различных двоичных форматов, которые могут использоваться для представления Unicode. 2) Юникод нельзя продвигать долго до появления Интернета.
Популярность Интернета настоятельно требует единого метода кодирования. UTF-8 - наиболее широко используемая реализация Unicode в Интернете. Другие методы реализации включают UTF-16 (символы представлены двумя байтами или четырьмя байтами) и UTF-32 (символы представлены четырьмя байтами), но они в основном не используются в Интернете. Повторяю, здесь связь заключается в том, что UTF-8 является одной из реализаций Unicode.
Одной из самых больших особенностей UTF-8 является то, что это метод кодирования переменной длины. Он может использовать от 1 до 4 байтов для представления символа, а длина байта зависит от разных символов.
Правила кодировки UTF-8 очень простые, их всего два:
1) Для однобайтового символа первый бит байта установлен в 0, а следующие 7 битов являются кодом Юникода этого символа. Поэтому для английских букв кодировка UTF-8 и код ASCII одинаковы.
2) Для n-байтовых символов (n> 1) все первые n бит первого байта устанавливаются на 1, n + 1-й бит устанавливается на 0, а первые два бита следующих байтов устанавливаются на 10. Остальные не упомянутые двоичные биты - это все коды Unicode этого символа.
В следующей таблице приведены правила кодирования, буква x представляет доступные биты кодирования.
Диапазон символов Unicode | метод кодирования UTF-8
(шестнадцатеричный) | (двоичный)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Согласно приведенной выше таблице интерпретация кодировки UTF-8 очень проста. Если первый бит байта равен 0, сам байт является символом; если первый бит равен 1, сколько единиц подряд идет, это означает, сколько байтов занимает текущий символ.
Затем возьмем китайский символ "strict" в качестве примера, чтобы продемонстрировать, как реализовать кодировку UTF-8.
Известно, что «строгий» юникод - это 4E25 (100111000100101). Согласно приведенной выше таблице можно обнаружить, что 4E25 находится в диапазоне третьей строки (0000 0800-0000 FFFF), поэтому для «строгой» кодировки UTF-8 требуется три байта , То есть формат «1110xxxx 10xxxxxx 10xxxxxx». Затем, начиная с последнего двоичного бита «strict», заполните x в формате от конца до конца и добавьте 0 к дополнительным битам. Таким образом, «строгая» кодировка UTF-8 будет «11100100 10111000 10100101», а преобразованная в шестнадцатеричную - E4B8A5.
6. Порядок прямого и прямого порядка байтов
Как упоминалось в предыдущем разделе, коды Unicode могут храниться непосредственно в формате UCS-2. В качестве примера возьмем китайский символ "строгий". Код Unicode - 4E25, для которого требуется два байта для хранения, один байт - 4E, а другой - 25. При сохранении 4E находится впереди, а 25 - сзади, что является режимом с прямым порядком байтов; 25 - спереди, а 4E - сзади, что является режимом с прямым порядком байтов.
Эти два странных имени пришли от британского писателя Свифта."Путешествия Гулливера". В книге,ЛилипутЗдесь разразилась гражданская война, и причиной войны стали споры людей о том, начинать ли есть яйца с большого конца (Big-Endian) или с малого (Little-Endian). По этому поводу до и после разразились шесть войн: один император умер, а другой император потерял трон.
Следовательно, первый байт является "прямым порядком байтов", а второй байт - "прямым порядком байтов".
Естественно, возникнет вопрос: как компьютер узнает, каким способом кодировать определенный файл?
В спецификации Unicode определено, что символ, представляющий последовательность кодирования, добавляется в начало каждого файла.Имя этого символа называется «ZERO WIDTH NO-BREAK SPACE», что представляется FEFF. Это ровно два байта, а FF на 1 больше, чем FE.
Если первые два байта текстового файла - это FE FF, это означает, что файл принимает режим большого конца; если первые два байта - FF FE, это означает, что файл принимает режим малого конца.
Решение
Используйте Notepad ++ для редактирования и преобразования в формат UTF-8 без спецификации
Процесс позиционирования
Два дня спустя разработчик дал мне два файла и спросил, могу ли я найти разницу между двумя файлами. Я посмотрел, и содержимое файла точно такое же.
Позже я использовал программу вне всякого сравнения, чтобы сравнить шестнадцатеричную систему и, наконец, нашел разницу.
В одной из первых строк есть еще три байта «EF BB BF», как показано на рисунке ниже.
Юникодная подпись BOM (метка порядка байтов) проблемная запись файла UTF-8 (EF BB BF)
В предыдущем тесте таких проблем не было.Номер TXT списка рассылки, полученный от оператора, соответствует правилам, а формат - требуемый UTF-8. Неисправностей не обнаружено.
Поскольку у блогеров другие потребности, они напрямую откликаются на разработку, пускают позиционирование разработки.
причина
В результате нескольких проверок было обнаружено, что существует разница между UTF-8 и BOM.
BOM (Byte Order Mark) - это стандартная метка, используемая для идентификации кодировки в схеме кодирования UTF. В UTF-16 это изначально был FF FE, но когда он становится UTF-8, он становится EF BB BF. Этот флаг является необязательным, поскольку байты UTF8 не имеют порядка, поэтому его можно использовать для определения того, закодирован ли поток байтов в кодировке UTF-8. Microsoft выполняет это обнаружение, но некоторые программы не делают этого обнаружения и рассматривают его как нормальный символ.
Microsoft добавила три байта EF, BB и BF перед своим собственным текстовым файлом в формате UTF-8. Такие программы, как блокнот в Windows, используют эти три байта, чтобы определить, является ли текстовый файл ASCII или UTF-8. Однако это только отметка, сделанная Microsoft тайно, и для текстовых файлов UTF-8 на других платформах такой отметки нет.
Другими словами, файл UTF-8 может иметь или не иметь спецификации.
Читайте также: