Значение —
Чтобы понять атрибут «encoding», вы должны понять разницу между байтами и символами .
Думайте о байтах как о числах от 0 до 255, в то время как символы-это такие вещи, как «a», «1» и «Ä». Набор всех доступных символов называется набором символов .
Каждый символ имеет последовательность из одного или нескольких байтов, которые используются для его представления; однако точное количество и значение байтов зависит от используемой кодировки , и существует множество различных кодировок.
Большинство кодировок основаны на старом наборе символов и кодировке под названием ASCII, которая представляет собой один байт на символ (на самом деле всего 7 бит) и содержит 128 символов, включая множество распространенных символов, используемых в английском языке США.
Например, вот 6 символов в наборе символов ASCII, которые представлены значениями от 60 до 65.
Extract of ASCII Table 60-65 ╔══════╦══════════════╗ ║ Byte ║ Character ║ ╠══════╬══════════════║ ║ 60 ║ < ║ ║ 61 ║ = ║ ║ 62 ║ > ║ ║ 63 ║ ? ║ ║ 64 ║ @ ║ ║ 65 ║ A ║ ╚══════╩══════════════╝
В полном наборе ASCII наименьшее используемое значение равно нулю, а наибольшее-127 (оба они являются скрытыми управляющими символами).
Однако, как только вам понадобится больше символов, чем предоставляет базовый ASCII (например, буквы с акцентами, символы валюты, графические символы и т. Д.), ASCII не подходит, и вам нужно что-то более обширное. Вам нужно больше символов (другой набор символов), и вам нужна другая кодировка, так как 128 символов недостаточно, чтобы вместить все символы. Некоторые кодировки предлагают один байт (256 символов) или до шести байт.
Со временем было создано множество кодировок. В мире Windows существует CP1252, или ISO-8859-1, в то время как Linux пользователей, как правило, предпочитают UTF-8. Java использует UTF-16 изначально.
Одна последовательность байтовых значений для символа в одной кодировке может означать совершенно другой символ в другой кодировке или даже может быть недопустимой.
Например, в ISO 8859-1 он представлен одним байтом значения 226
, тогда как в UTF-8 это два байта: 195, 162
. Однако в ISO 8859-1 195, 162
будет состоять из двух символов, Ã,¢ .
Думайте о XML не как о последовательности символов, а как о последовательности байтов.
Представьте, что система, получающая XML, видит байты 195, 162
. Откуда он знает, что это за персонажи?
Чтобы система могла интерпретировать эти байты как фактические символы (и таким образом отображать их или преобразовывать в другую кодировку), ей необходимо знать кодировку, используемую в XML.
Поскольку большинство распространенных кодировок совместимы с ASCII, что касается основных буквенных символов и символов, в этих случаях само объявление может сойти с рук, используя только символы ASCII, чтобы сказать, что такое кодировка. В других случаях синтаксический анализатор должен попытаться выяснить кодировку объявления. Поскольку он знает, что объявление начинается с <?xml
, это намного проще сделать.
Наконец, атрибут version
указывает версию XML, которых на данный момент существует две (см. Википедию XML версий . Существуют небольшие различия между версиями, поэтому синтаксический анализатор XML должен знать, с чем он имеет дело. В большинстве случаев (во всяком случае, для носителей английского языка) достаточно версии 1.0.
Модуль ngx_http_charset_module
Модуль ngx_http_charset_module
Модуль ngx_http_charset_module
добавляет указанную
кодировку в поле “Content-Type” заголовка ответа.
Кроме того, модуль может перекодировать данные из одной кодировки в другую
с некоторыми ограничениями:
- перекодирование осуществляется только в одну сторону — от сервера к клиенту,
- перекодироваться могут только однобайтные кодировки
- или однобайтные кодировки в UTF-8 и обратно.
Пример конфигурации
include conf/koi-win; charset windows-1251; source_charset koi8-r;
Директивы
Синтаксис: | charset |
---|---|
Умолчание: | charset off; |
Контекст: | http , , location , if в location |
Добавляет указанную кодировку в поле “Content-Type” заголовка ответа. Если эта кодировка отличается от указанной в директиве source_charset, то выполняется перекодирование.
Параметр off
отменяет добавление кодировки
в поле “Content-Type” заголовка ответа.
Кодировка может быть задана с помощью переменной:
charset $charset;
В этом случае необходимо, чтобы все возможные значения переменной
присутствовали хотя бы один раз в любом месте конфигурации в виде
директив charset_map, charset или
source_charset.
Для кодировок utf-8
, windows-1251
и koi8-r
для этого достаточно включить в конфигурацию
файлы conf/koi-win
, conf/koi-utf
и conf/win-utf
.
Для других кодировок можно просто сделать фиктивную таблицу перекодировки,
например:
charset_map iso-8859-5 _ { }
Кроме того, кодировка может быть задана в поле “X-Accel-Charset” заголовка ответа. Эту возможность можно запретить с помощью директив proxy_ignore_headers, fastcgi_ignore_headers, uwsgi_ignore_headers, scgi_ignore_headers и grpc_ignore_headers.
Синтаксис: | charset_map |
---|---|
Умолчание: | — |
Контекст: | http |
Описывает таблицу перекодирования из одной кодировки в другую.
Таблица для обратного перекодирования строится на основании тех же данных.
Коды символов задаются в шестнадцатеричном виде.
Неописанные символы в пределах 80-FF заменяются на “
”.
При перекодировании из UTF-8 символы, отсутствующие в однобайтной кодировке,
заменяются на “&#XXXX;
”.
Пример:
charset_map koi8-r windows-1251 { C0 FE ; # small yu C1 E0 ; # small a C2 E1 ; # small b C3 F6 ; # small ts ... }
При описании таблицы перекодирования в UTF-8, коды кодировки UTF-8 должны быть указаны во второй колонке, например:
charset_map koi8-r utf-8 { C0 D18E ; # small yu C1 D0B0 ; # small a C2 D0B1 ; # small b C3 D186 ; # small ts ... }
Полные таблицы преобразования из koi8-r
в windows-1251
и из koi8-r
и windows-1251
в utf-8
входят в дистрибутив и находятся в файлах conf/koi-win
, conf/koi-utf
и conf/win-utf
Синтаксис: | charset_types |
---|---|
Умолчание: | charset_types text/html text/xml text/plain text/vnd.wap.wml application/javascript application/rss+xml; |
Контекст: | http , server , location |
Эта директива появилась в версии 0.7.9.
Разрешает работу модуля в ответах с указанными MIME-типами
в дополнение к “text/html
”.
Специальное значение “*
” соответствует любому MIME-типу
(0.8.29).
До версии 1.5.4 по умолчанию вместо MIME-типа “application/javascript
” использовался “ application/x-javascript
”.
Синтаксис: | override_charset |
---|---|
Умолчание: | override_charset off; |
Контекст: | http , server , location , if в location |
Определяет, выполнять ли перекодирование для ответов, полученных от проксированного сервера или от FastCGI/uwsgi/SCGI/gRPC-сервера, если в ответах уже указана кодировка в поле “Content-Type” заголовка ответа. Если перекодирование разрешено, то в качестве исходной кодировки используется кодировка, указанная в полученном ответе.
Необходимо отметить, что если ответ был получен в подзапросе,
то, независимо от значения директивы override_charset
,
всегда выполняется перекодирование из кодировки ответа в кодировку
основного запроса.
Синтаксис: | source_charset |
---|---|
Умолчание: | — |
Контекст: | http , server , location , if в location |
Задаёт исходную кодировку ответа. Если эта кодировка отличается от указанной в директиве charset, то выполняется перекодирование.
Юникод в Python — Введение в Python
Unicode in Python
Before the Unicode
- Memory consists of bytes
- A string is a chain of bytes
- One byte can have up to 256 values
- One byte can mark one of 256 symbols
- To print a byte, you should find a symbol that it marks…
- … with a special table, named
Code page
ASCII Code page
- a special table that compares bytes with symbols
- ASCII table as a standard
- 0..127 for latin and system symbols
- 128..255 for extended symbols
How about foreign languages?
- 0..127 for latin and system symbols anyway
- 128..255 for realm-specific symbols
- One realm — one code page
cp866
DOS-Cyrilliccp1251
Windows-Cyrilliccp1253
Windows-Creek- etc
Encoding hell
- Lots of code pages
- Every message should declare the code page
- Encode/decode errors, strange symbols instead of text
- Remember your inbox 10 years ago
How does it fail
- User A types
"Привет"
on Linux (utf-8) - The bytes are
\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82
- The program should send a header with encoding, but it doesn’t
- User B receives the message without header on Windows (cp1251)
- So default code page becomes cp1251
- Decoded message is
Привет
- :—(
The solution is Unicode
- It’s a common unlimited alphabet
- Every symbol has its own number
- Unicode is growing
U+XXXX
to refer a specific code
U+0031 1
U+00A9 ©
U+20AC €
U+266B ♫
U+4E64 乤
U+45B4 䖴
What is UTF?
- An algorithm how turn Unicode into bytes and read it back
- There are
UTF-8
,-16
and-32
encodings UTF-8
uses 1 byte for latin and 2 bytes for non-latinUTF-8
is compatible with english text- Can encode large subset of Unicode
Still have problems with Unicode?
- Try to use
UTF-8
encoding everywhere - Read Joel Spolsky «About Unicode and Character Sets»
Unicode in Python 2.x
- Unicode strings are declared with
u'...'
prefix - The should be coding directive in your file
- Use
\uXXXX
to refer unicode symbols0..FFFF
\UXXXXXXXX
to refer0..FFFFFFFF
symbols (rare)
# coding=utf-8 # -*- coding: utf-8 -*-
name = u'Иван'
name = u'Ιαννης'
name = u'João'
greet = u'\u041f\u0440\u0438\u0432\u0435\u0442'
print greet
>>> Привет
print u'\U0000041f\U00000440\U00000438\U00000432\U00000435\U00000442'
>>> Привет
data = u"""
Any string in english
Любая строка на русском
任何字符串在中國"""
print data
Any string in english
Любая строка на русском
任何字符串在中國
repr(data)
u'\nAny string in english\n\u041b\u044e\u0431\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c\n\u4efb\u4f55\u5b57\u7b26\u4e32\u5728\u4e2d\u570b\n'
How to turn an object into Unicode
unicode([1, 2, True, {"test": 42}])
>>> u"[1, 2, True, {'test': 42}]"
unicode(obj) == obj.__unicode__()
class User(object):
def __unicode__(self):
return u'%s %s' % (self.name, self.surname)
user = User(...)
unicode(user) # u'Михаил Паниковский'
How to turn a 8-bit string into Unicode
message = '\xcf\xf0\xe8\xe2\xe5\xf2'
decoded = message.decode('cp1251')
repr(decoded)
>>> u'\u041f\u0440\u0438\u0432\u0435\u0442'
print decoded
Привет
message = '\x8f\xe0\xa8\xa2\xa5\xe2'
decoded = unicode(message, 'cp866')
>>> Привет
How to turn a Unicode into 8-bit string
udata = u'Сообщение'
udata.encode('cp1251')
>>> '\xd1\xee\xee\xe1\xf9\xe5\xed\xe8\xe5'
udata.encode('utf-8')
>>> '\xd0\xa1\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8'
Encode/decode chaining
u'Иван'.encode('cp866').decode('cp866')
>>> u'\u0418\u0432\u0430\u043d'
'\x88\xa2\xa0\xad'.decode('cp866').encode('utf-8')
>>> '\xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd'
Encode/Decode errors
>>> u'Ivan'.encode('cp1251')
'Ivan'
>>> u'Иван'.encode('cp1251')
'\xc8\xe2\xe0\xed'
>>> u'任何字符串在中國'.decode('cp1251')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
The meaning of strings
- Unicode is a human string
- 8-bit string is just bytes
- Avoid printing bytes
- The result depends on locale, code page, etc
Don’t mix unicode and 8-bit strings!
u'Привет, ' + 'Ivan'
Привет, Ivan
u'Привет, ' + 'Иван'
>>> UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
name = '\xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd'
u'Привет, ' + name.decode('utf-8')
>>> Привет, Иван
Methods are same
data = u'Юникод и Ко'
data.upper() # ЮНИКОД И КО
data.lower() # юникод и ко
data.split(u' ')
>>> [u'\u042e\u043d\u0438\u043a\u043e\u0434', u'\u0438', u'\u041a\u043e']
data.replace(u'Ко', u'Компания') # Юникод и Компания
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты.
Ошибки, сложный материал, вопросы >Нашли опечатку или неточность?
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Что-то не получается или материал кажется сложным?
Загляните в раздел «Обсуждение»:
- задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
- расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
- изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете
android — Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Я использую Unity 2020, и когда я пытаюсь скомпилировать свой проект, я получаю следующие ошибки:
1)
> Configure project :launcher
WARNING: The option 'android.enableR8' is deprecated and should not be used anymore.
It will be removed in a future version of the Android Gradle plugin, and will no longer allow
you to disable R8.
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':unityLibrary:compileReleaseJavaWithJavac'.
> Failed to query the value of task ':unityLibrary:compileReleaseJavaWithJavac' property
'options.generatedSourceOutputDirectory'.
> Querying the mapped value of map(java.io.File property(org.gradle.api.file.Directory,
property(org.gradle.api.file.Directory, fixed(class
org.gradle.api.internal.file.DefaultFilePropertyFactory$FixedDirectory,
H:\FinalPluginProjectTest\Temp\gradleOut\unityLibrary\build\generated\ap_generated_sources\release\out))) org.gradle.api.internal.file.DefaultFilePropertyFactory$ToFileTransformer@545c8bb4) before task ':unityLibrary:compileReleaseJavaWithJavac' has completed is not supported
CommandInvokationFailure: Gradle build failed.
C:\Program Files\Java\jdk1.8.0_281\bin\java.exe -classpath "H:\gradle-7.0\lib\gradle-launcher-
7.0.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx4096m" "assembleRelease"
stderr[
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':unityLibrary:compileReleaseJavaWithJavac'.
> Failed to query the value of task ':unityLibrary:compileReleaseJavaWithJavac' property
'options.generatedSourceOutputDirectory'.
> Querying the mapped value of map(java.io.File property(org.gradle.api.file.Directory,
property(org.gradle.api.file.Directory, fixed(class
org.gradle.api.internal.file.DefaultFilePropertyFactory$FixedDirectory,
H:\FinalPluginProjectTest\Temp\gradleOut\unityLibrary\build\generated\ap_generated_sources\release\out))) org.gradle.api.internal.file.DefaultFilePropertyFactory$ToFileTransformer@545c8bb4) before task ':unityLibrary:compileReleaseJavaWithJavac' has completed is not supported
кто-нибудь знает, в чем проблема? Если нужно добавить информацию, пишите! Пожалуйста, помогите, если сможете, заранее спасибо!
HowTo: Check and Change File Encoding In Linux
The Linux administrators that work with web hosting know how is it important to keep correct character encoding of the html documents.
From the following article you’ll learn how to check a file’s encoding from the command-line in Linux.
You will also find the best solution to convert text files between different charsets.
I’ll also show the most common examples of how to convert a file’s encoding between CP1251
(Windows-1251, Cyrillic), UTF-8
, ISO-8859-1
and ASCII
charsets.
Cool Tip: Want see your native language in the Linux terminal? Simply change locale! Read more →
Check a File’s Encoding
Use the following command to check what encoding is used in a file:
$ file -bi [filename]
Option | Description |
---|---|
-b , --brief | Don’t print filename (brief mode) |
-i , --mime | Print filetype and encoding |
Check the encoding of the file in.txt
:
$ file -bi in.txt text/plain; charset=utf-8
Change a File’s Encoding
Use the following command to change the encoding of a file:
$ iconv -f [encoding] -t [encoding] -o [newfilename] [filename]
Option | Description |
---|---|
-f , --from-code | Convert a file’s encoding from charset |
-t , --to-code | Convert a file’s encoding to charset |
-o , --output | Specify output file (instead of stdout) |
Change a file’s encoding from CP1251
(Windows-1251, Cyrillic) charset to UTF-8
:
$ iconv -f cp1251 -t utf-8 in.txt
Change a file’s encoding from ISO-8859-1
charset to and save it to out.txt
:
$ iconv -f iso-8859-1 -t utf-8 -o out.txt in.txt
Change a file’s encoding from ASCII
to UTF-8
:
$ iconv -f utf-8 -t ascii -o out.txt in.txt
Change a file’s encoding from UTF-8
charset to ASCII
:
Illegal input sequence at position: As UTF-8 can contain characters that can’t be encoded with ASCII, the iconv
will generate the error message “illegal input sequence at position” unless you tell it to strip all non-ASCII characters using the -c
option.
$ iconv -c -f utf-8 -t ascii -o out.txt in.txt
Option | Description |
---|---|
-c | Omit invalid characters from the output |
You can lose characters: Note that if you use the iconv
with the -c
option, nonconvertible characters will be lost.
This concerns in particular Windows machines with Cyrillic.
You have copied some file from Windows to Linux, but when you open it in Linux, you see “Êàêèå-òî êðàêîçÿáðû” – WTF!?
Don’t panic – such strings can be easily converted from CP1251
(Windows-1251, Cyrillic) charset to UTF-8
with:
$ echo "Êàêèå-òî êðàêîçÿáðû" | iconv -t latin1 | iconv -f cp1251 -t utf-8 Какие-то кракозябры
List All Charsets
List all the known charsets in your Linux system:
$ iconv -l
Option | Description |
---|---|
-l , --list | List known charsets |
Использование UTF-8 в HTTP заголовках – CUBA Platform
Как известно, HTTP 1.1 — это текстовой протокол передачи данных. HTTP сообщения закодированы, используя ISO-8859-1 (которую условно можно считать расширенной версией ASCII, содержащей умляуты, диакритику и другие символы, используемые в западноевропейских языках). При этом в теле сообщений можно использовать другую кодировку, которая должна быть обозначена в заголовке «Content-Type». Но что делать, если нам необходимо задать non-ASCII символы не в теле сообщения, а в самих заголовках? Наверное, самый распространенный кейс — это проставление имени файла в «Content-Disposition» заголовке. Это, казалось бы, довольно распространенная задача, но ее реализация не так очевидна.
TL;DR: Используйте кодировку, описанную в RFC 6266, для «Content-Disposition» и преобразуйте текст в латиницу (транслит) в остальных случаях.
Небольшая вводная в кодировки
В статье упоминаются и используются кодировки US-ASCII (часто именуемую просто ASCII), ISO-8859-1 и UTF-8. Это небольшая вводная в эти кодировки. Раздел предназначен для разработчиков, которые редко или совсем не работают с кодировками и успели подзабыть их.8 = 256 вариантов.
ISO-8859-1 — кодировка, предназначенная для западноевропейских языков. Содержит французскую диакритику, немецкие умляуты и т.д.
Кодировка содержит 256 символов и, таким образом, может быть представлена одним байтом. Первая половина (128 символов) полностью совпадает с ASCII. Таким образом, если первый бит = 0, то это обычный ASCII символ. Если 1, то это символ, специфичный для ISO-8859-1.
UTF-8 — одна из самых известных кодировок наравне с ASCII. Способна кодировать 1.112.064 символов. Размер каждого символа варьируется от 1-го до 4-х байт (раньше допускались значения до 6 байт).
Программа, работающая с этой кодировкой, определяет по первым битам, как много байтов входит в символ. Если октет начинается с 0, то символ представлен одним байтом. 110 — два байта, 1110 — три байта, 11110 — 4 байта.
Как и в случае с ISO-8859-1, первые 128 символов полностью соответствуют ASCII. Поэтому тексты, использующие только ASCII символы, будут абсолютно идентичны в бинарном представлении, вне зависимости от того, использовалась ли для кодирования US-ASCII, ISO-8859-1 или UTF-8.
Использование UTF-8 в теле сообщения
Прежде чем перейти к заголовкам, давайте быстро взглянем, как использовать UTF-8 в теле сообщений. Для этого используется заголовок «Content-Type».
Если «Content-Type» не задан, то браузер должен обрабатывать сообщения, как будто они написаны в ISO-8859-1. Браузер не должен пытаться отгадать кодировку и, тем более, игнорировать «Content-Type». Но, что реально отобразится в ситуации, когда «Content-Type» не передан, зависит от реализации браузера. Например, Firefox сделает согласно спецификации и прочитает сообщение, будто оно было закодировано в ISO-8859-1. Google Chrome, напротив, будет использовать кодировку операционной системы, которая для многих российских пользователей равна Windows-1251. В любом случае, если сообщение было в UTF-8, то оно будет отображено некорректно.
Проставляем UTF-8 сообщение в значение заголовка
С телом сообщения все достаточно просто. Тело сообщения всегда следует после заголовков, поэтому здесь не возникает технических проблем. Но как быть с заголовками? В спецификации недвусмысленно заявляется, что порядок заголовков в сообщении не имеет значения. Т.е. задать кодировку в одном заголовке через другой заголовок не представляется возможным.
Что будет, если просто взять и записать UTF-8 значение в значение заголовка? Мы видели, что такой трюк с телом сообщения приведет к тому, что значение будет просто прочитано в ISO-8859-1. Логично было бы предположить, что то же самое произойдет с заголовком. Но это не так. Фактически, во многих, если не в большинстве, случаях такое решение будет работать. Сюда включаются старые айфончики, IE11, Firefox, Google Chrome. Единственным из находящихся у меня под рукой браузеров, когда я писал эту статью, который не захотел работать с таким заголовком, является Edge.
Такое поведение не зафиксировано в спецификациях. Возможно, разработчики браузеров решили облегчить жизнь разработчиков и автоматически определять, что в заголовках сообщение закодировано в UTF-8. В общем-то, это не является такой сложной задачей. Смотрим на первый бит: если 0, то ASCII, если 1 — то, возможно, UTF-8.
Нет ли в этом случае пересечения с ISO-8859-1? На самом деле, практически нет. Возьмем для примера UTF-8 символ из 2-х октетов (русские буквы представлены двумя октетами). Символ в бинарном представлии будет иметь вид: 110xxxxx 10xxxxxx. В HEX представлении: [0xC0-0x6F] [0x80-0xBF]. В ISO-8859-1 этими символами едва ли можно закодировать что-то, несущее смысловую нагрузку. Поэтому риск того, что браузер неправильно расшифрует сообщение, очень мал.
Однако, при попытке использовать этот способ можно столкнуться с техническими проблемами: ваш веб-сервер или фреймворк может просто не разрешить записывать UTF-8 символы в значение заголовка. Например, Apache Tomcat вместо всех UTF-8 символов проставляет 0x3F (вопросительный знак). Разумеется, это ограничение можно обойти, но, если само приложение бьет по рукам и не дает что-то сделать, то, возможно, вам и не нужно это делать.
Но, независимо от того, разрешает ли вам ваш фреймворк или сервер записать UTF-8 сообщения в заголовок или нет, я не рекомендую этого делать. Это не задокументированное решение, которое в любой момент времени может перестать работать в браузерах.
Транслит
Я думаю, что использовать транслит — eto bolee horoshee reshenie. Многие крупные популярные русские ресурсы не брезгуют использовать транслит в названиях файлов. Это гарантированное решение, которое не сломается с выпуском новых браузеров и которое не надо тестировать отдельно на каждой платформе. Хотя, разумеется, надо подумать, как преобразовывать весь спектр возможных символов, что может быть не совсем тривиально. Например, если приложение рассчитано на российскую аудиторию, то в имя файла могут попасть татарские буквы ә и ң, которые надо как-то обработать, а не просто заменять на «?».
RFC 2047
Как я уже упомянул, томкат не позволил мне проставить UTF-8 в заголовке сообщения. Отражена ли эта особенность поведения в Java docs для сервлетов? Да, отражена:
Упоминается RFC 2047. Я пробовал кодировать сообщения, используя этот формат, — браузер меня не понял. Этот метод кодировки не работает в HTTP. Хотя работал раньше. Вот, например, тикет на удаление поддержки этой кодировки из Firefox.
RFC 6266
В тикете, ссылка на который содержится в предыдущем разделе, есть упоминания, что даже после прекращения поддержки RFC 2047, все еще есть способ передавать UTF-8 значения в названии скачиваемых файлов: RFC 6266. На мой взгляд, это самое правильно решение на сегодняшний день. Многие популярные интернет ресурсы используют его. Мы в CUBA Platform также используем именно этот RFC для генерации «Content-Disposition».
RFC 6266 — это спецификация, описывающая использование “Content-Disposition” заголовка. Сам способ кодировки подробно описан в другой спецификации — RFC 8187.
Параметр “filename” содержит название файла в ASCII, “filename*” — в любой необходимой кодировке. При наличии обоих атрибутов “filename” игнорируется во всех современных браузерах (включая IE11 и старые версии Safari). Совсем старые браузеры, напротив, игнорируют “filename*”.
При использовании данного способа кодирования в параметре сначала указывается кодировка, после » идет закодированное значение. Видимые символы из ASCII кодирования не требуют. Остальные символы просто пишутся в hex представлении, со стоящим «%» перед каждым октетом.
Что делать с другими заголовками?
Кодирование, описанное в RFC 8187, не является универсальным. Да, можно поместить в заголовок параметр с * префиксом, и это, возможно, будет даже работать для некоторых браузеров, но спецификация предписывает не делать так.
В каждом случае, где в заголовках поддерживается UTF-8, на настоящий момент есть явное упоминание об этом в релевантном RFC. Помимо «Content-Disposition» данная кодировка используется, например, в Web Linking и Digest Access Authentication.
Следует учесть, что стандарты в этой области постоянно меняются. Использование описанной выше кодировки в HTTP было предложено лишь в 2010. Использование данной кодировки именно в «Content-Disposition» было зафиксировано в стандарте в 2011. Несмотря на то, что эти стандарты находятся лишь на стадии «Proposed Standard», они поддержаны повсеместно. Вариант, что в будущем нас ожидают новые стандарты, которые позволят более унифицировано работать с различными кодировками в заголовках, не исключен. Поэтому остается только следить за новостями в мире стандартов HTTP и уровня их поддержки на стороне браузеров.
Кодирование и декодирование / Хабр
Причиной разобраться в том, как же работает UTF-8 и что такое Юникод заставил тот факт, что VBScript не имеет встроенных функций работы с UTF-8. А так как ничего рабочего не нашел, то пришлось писть/дописывать самому. Опыт на мой взгляд полезный в любом случае. Для лучшего понимания начну с теории.
О Юникоде
До появления Юникода широко использовались 8-битные кодировки, главные минусы которых очевидны:
- Всего 255 символов, да и то часть из них не графические;
- Возможность открыть документ не с той кодировкой, в которой он был создан;
- Шрифты необходимо создавать для каждой кодировки.
Так и было решено создать единый стандарт «широкой» кодировки, которая включала бы все символы (при чем сначала хотели в нее включить только обычные символы, но потом передумали и начали добавлять и экзотические). Юникод использует 1 112 064 кодовых позиций (больше чем 16 бит). Начало дублирует ASCII, а дальше остаток латиницы, кирилица, другие европейские и азиатские символы. Для обозначений символов используют шестнадцатеричную запись вида «U+xxxx» для первых 65k и с большим количеством цифр для остальных.
О UTF-8
Когда-то я думал что есть Юникод, а есть UTF-8. Позже я узнал, что ошибался.
UTF-8 является лишь представлением Юникода в 8-битном виде. Символы с кодами меньше 128 представляются одним байтом, а так как в Юникоде они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII. Символы же с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 — 3-мя, от 65536 — 4-мя. Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.
0x00000000 — 0x0000007F: 0xxxxxxx 0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Кодируем в UTF-8
Порядок действий примерно такой:
- Каждый символ превращаем в Юникод.
- Проверяем из какого символ диапазона.
- Если код символа меньше 128, то к результату добавляем его в неизменном виде.
- Если код символа меньше 2048, то берем последние 6 бит и первые 5 бит кода символа. К первым 5 битам добавляем 0xC0 и получаем первый байт последовательности, а к последним 6 битам добавляем 0x80 и получаем второй байт. Конкатенируем и добавляем к результату.
- Похожим образом можем продолжить и для больших кодов, но если символ за пределами U+FFFF придется иметь дело с UTF-16 суррогатами.
Function EncodeUTF8(s)
Dim i, c, utfc, b1, b2, b3
For i=1 to Len(s)
c = ToLong(AscW(Mid(s,i,1)))
If c < 128 Then
utfc = chr( c)
ElseIf c < 2048 Then
b1 = c Mod &h50
b2 = (c - b1) / &h50
utfc = chr(&hC0 + b2) & chr(&h80 + b1)
ElseIf c < 65536 And (c < 55296 Or c > 57343) Then
b1 = c Mod &h50
b2 = ((c - b1) / &h50) Mod &h50
b3 = (c - b1 - (&h50 * b2)) / &h2000
utfc = chr(&hE0 + b3) & chr(&h80 + b2) & chr(&h80 + b1)
Else
' Младший или старший суррогат UTF-16
utfc = Chr(&hEF) & Chr(&hBF) & Chr(&hBD)
End If
EncodeUTF8 = EncodeUTF8 + utfc
Next
End Function
Function ToLong(intVal)
If intVal < 0 Then
ToLong = CLng(intVal) + &h20000
Else
ToLong = CLng(intVal)
End If
End Function
Декодируем UTF-8
- Ищем первый символ вида 11xxxxxx
- Считаем все последующие байты вида 10xxxxxx
- Если последовательность из двух байт и первый байт вида 110xxxxx, то отсекаем приставки и складываем, умножив первый байт на 0x40.
- Аналогично для более длинных последовательностей.
- Заменяем всю последовательность на нужный символ Юникода.
Function DecodeUTF8(s)
Dim i, c, n, b1, b2, b3
i = 1
Do While i <= len(s)
c = asc(mid(s,i,1))
If (c and &hC0) = &hC0 Then
n = 1
Do While i + n <= len(s)
If (asc(mid(s,i+n,1)) and &hC0) <> &h80 Then
Exit Do
End If
n = n + 1
Loop
If n = 2 and ((c and &hE0) = &hC0) Then
b1 = asc(mid(s,i+1,1)) and &h4F
b2 = c and &h2F
c = b1 + b2 * &h50
Elseif n = 3 and ((c and &hF0) = &hE0) Then
b1 = asc(mid(s,i+2,1)) and &h4F
b2 = asc(mid(s,i+1,1)) and &h4F
b3 = c and &h0F
c = b3 * &h2000 + b2 * &h50 + b1
Else
' Символ больше U+FFFF или неправильная последовательность
c = &hFFFD
End if
s = left(s,i-1) + chrw( c) + mid(s,i+n)
Elseif (c and &hC0) = &h80 then
' Неожидаемый продолжающий байт
s = left(s,i-1) + chrw(&hFFFD) + mid(s,i+1)
End If
i = i + 1
Loop
DecodeUTF8 = s
End Function
Ссылки
Юникод на Википедии
Исходник для ASP+VBScript
UPD: Обработка ошибочных последовательностей и ошибка с типом Integer, который возвращает AscW.
Что такое кодировка UTF-8? Руководство для непрограммистов
Текст: его важность в Интернете само собой разумеется. Это первая буква «Т» в «HTTP», единственная буква «Т» в «HTML», и практически каждый веб-сайт так или иначе использует ее, будь то URL-адрес, часть маркетингового текста, обзор продукта, вирусный твит или Сообщение блога. (Привет!)
Но веб-текст на самом деле может быть не таким простым, как вы думаете. Рассмотрим тысячи языков, на которых сегодня говорят, или все знаки препинания и символы, которые мы можем добавить, чтобы улучшить их, или тот факт, что создаются новые смайлики, чтобы уловить каждую человеческую эмоцию.Как веб-сайты все это хранят и обрабатывают?По правде говоря, даже такая простая вещь, как текст, требует хорошо скоординированной, четко определенной системы для отображения в веб-браузерах. В этом посте я расскажу об основах одной технологии, имеющей ключевое значение для текста в Интернете, UTF-8 . Мы изучим основы хранения и кодирования текста и обсудим, как это помогает разместить на вашем сайте привлекательные слова.
Прежде чем мы начнем, вы должны быть знакомы с основами HTML и готовы погрузиться в легкую информатику.
Что такое UTF-8?
UTF-8 означает «Формат преобразования Unicode — 8 бит». Пока это нам не помогает, так что давайте вернемся к основам.
Двоичный: как компьютеры хранят информацию
Для хранения информации компьютеры используют двоичную систему. В двоичном формате все данные представлены последовательностями из единиц и нулей. Самая основная единица двоичного кода — это бит , который представляет собой всего лишь единицу 1 или 0. Следующая по величине единица двоичного кода, байт, состоит из 8 бит.Пример байта — «01101011».
Каждый цифровой актив, с которым вы когда-либо сталкивались, — от программного обеспечения до мобильных приложений, от веб-сайтов до историй в Instagram — построен на этой системе байтов, которые связаны друг с другом таким образом, чтобы они имели смысл для компьютеров. Когда мы говорим о размерах файлов, мы имеем в виду количество байтов. Например, килобайт — это примерно тысяча байт, а гигабайт — примерно миллиард байтов.
Текст — это один из многих ресурсов, которые хранятся и обрабатываются компьютерами.Текст состоит из отдельных символов, каждый из которых представлен в компьютерах строкой битов. Эти строки собираются в цифровые слова, предложения, абзацы, любовные романы и т. Д.
ASCII: преобразование символов в двоичные
Американский стандартный код обмена информацией (ASCII) был ранней стандартизированной системой кодирования текста. Кодирование — это процесс преобразования символов человеческих языков в двоичные последовательности, которые могут обрабатывать компьютеры.
БиблиотекаASCII включает в себя все прописные и строчные буквы латинского алфавита (A, B, C…), каждую цифру от 0 до 9 и некоторые общие символы (например, /,! И?). Он присваивает каждому из этих символов уникальный трехзначный код и уникальный байт.
В таблице ниже показаны примеры символов ASCII с соответствующими кодами и байтами.
Знак | Код ASCII | БАЙТ |
А | 065 | 01000001 |
a | 097 | 01100001 |
B | 066 | 01000010 |
б | 098 | 01100010 |
Z | 090 | 01011010 |
z | 122 | 01111010 |
0 | 048 | 00110000 |
9 | 057 | 00111001 |
! | 033 | 00100001 |
? | 063 | 00111111 |
Подобно тому, как символы объединяются в слова и предложения на языке, двоичный код делает это в текстовых файлах.Итак, фраза «Быстрая коричневая лисица перепрыгивает через ленивого пса». в двоичном формате ASCII будет:
01010100 01101000 01100101 00100000 01110001
01110101 01101001 01100011 01101011 00100000
01100010 01110010 01101111 01110111 01101110
00100000 01100110 01101111 01111000 00100000
01101010 01110101 01101101 01110000 01110011
00100000 01101111 01110110 01100101 01110010
00100000 01110100 01101000 01100101 00100000
01101100 01100001 01111010 01111001 00100000
01100100 01101111 01100111 00101110
Это мало что значит для нас, людей, но это хлеб с маслом для компьютера.
Число символов, которые может представлять ASCII, ограничено числом доступных уникальных байтов, поскольку каждый символ получает один байт. Если вы посчитаете, то обнаружите, что существует 256 различных способов сгруппировать восемь единиц и нулей вместе. Это дает нам 256 различных байтов или 256 способов представления символа в ASCII. Когда в 1960 году был представлен ASCII, это было нормально, поскольку разработчикам требовалось всего 128 байт для представления всех необходимых им английских символов и символов.
Но по мере глобального распространения компьютерных технологий компьютерные системы начали хранить текст не только на английском, но и на других языках, многие из которых использовали символы, отличные от ASCII.Были созданы новые системы для сопоставления других языков с одним и тем же набором из 256 уникальных байтов, но использование нескольких систем кодирования было неэффективным и запутанным. Разработчикам требовался лучший способ кодирования всех возможных символов с помощью одной системы.
Unicode: способ сохранить каждый символ, когда-либо
Введите Unicode, систему кодирования, которая решает проблему пространства ASCII. Как и ASCII, Unicode назначает уникальный код, называемый кодовой точкой , каждому символу. Однако более сложная система Unicode может создать более миллиона кодовых точек, чего более чем достаточно, чтобы учесть каждый символ на любом языке.
Unicode теперь является универсальным стандартом для кодирования всех человеческих языков. И да, он даже включает смайлики.
Ниже приведены несколько примеров текстовых символов и соответствующих им кодовых точек. Каждая кодовая точка начинается с буквы «U» для «Unicode», за которой следует уникальная строка символов, представляющая символ.
Знак | Кодовая точка |
А | U + 0041 |
a | U + 0061 |
0 | U + 0030 |
9 | U + 0039 |
! | U + 0021 |
Ø | U + 00D8 |
ڃ | U + 0683 |
ಚ | U + 0C9A |
𠜎 | U + 2070E |
😁 | U + 1F601 |
Если вы хотите узнать, как генерируются кодовые точки и что они означают в Unicode, ознакомьтесь с этим подробным объяснением.
Итак, теперь у нас есть стандартизированный способ представления каждого символа, используемого каждым человеческим языком, в одной библиотеке. Это решает проблему нескольких систем маркировки для разных языков — любой компьютер на Земле может использовать Unicode.
Но только Unicode не хранит слова в двоичном формате. Компьютерам нужен способ перевода Unicode в двоичный код, чтобы его символы можно было хранить в текстовых файлах. Вот где пригодится UTF-8.
UTF-8: последний фрагмент головоломки
UTF-8 — это система кодирования Unicode.Он может преобразовать любой символ Юникода в соответствующую уникальную двоичную строку, а также может преобразовать двоичную строку обратно в символ Юникода. Это значение «UTF» или «Формат преобразования Unicode».
Существуют и другие системы кодирования Unicode, помимо UTF-8, но UTF-8 уникален, поскольку представляет символы в однобайтовых единицах. Помните, что один байт состоит из восьми бит, отсюда и «-8» в его названии.
Более конкретно, UTF-8 преобразует кодовую точку (которая представляет один символ в Unicode) в набор от одного до четырех байтов.Первые 256 символов в библиотеке Unicode, которые включают символы, которые мы видели в ASCII, представлены как один байт. Символы, которые появляются позже в библиотеке Unicode, кодируются как двухбайтовые, трехбайтовые и, возможно, четырехбайтовые двоичные единицы.
Ниже приведена та же таблица символов сверху, с выводом UTF-8 для каждого добавленного символа. Обратите внимание, что некоторые символы представлены одним байтом, а другие используют больше.
Знак | Кодовая точка | Двоичная кодировка UTF-8 |
А | U + 0041 | 01000001 |
a | U + 0061 | 01100001 |
0 | U + 0030 | 00110000 |
9 | U + 0039 | 00111001 |
! | U + 0021 | 00100001 |
Ø | U + 00D8 | 11000011 10011000 |
ڃ | U + 0683 | 11011010 10000011 |
ಚ | U + 0C9A | 11100000 10110010 10011010 |
𠜎 | U + 2070E | 11110000 10100000 10011100 10001110 |
😁 | U + 1F601 | 11110000 10011111 10011000 10000001 |
Почему UTF-8 преобразует одни символы в один байт, а другие — в четыре байта? Короче для экономии памяти.Используя меньше места для представления более общих символов (например, символов ASCII), UTF-8 уменьшает размер файла, позволяя использовать гораздо большее количество менее распространенных символов. Эти менее распространенные символы кодируются в два или более байта, но это нормально, если они хранятся редко.
Пространственная эффективность — ключевое преимущество кодировки UTF-8. Если бы вместо этого каждый символ Unicode был представлен четырьмя байтами, текстовый файл, написанный на английском языке, был бы в четыре раза больше, чем тот же файл, закодированный с помощью UTF-8.
Еще одним преимуществом кодировки UTF-8 является ее обратная совместимость с ASCII. Первые 128 символов в библиотеке Unicode соответствуют символам в библиотеке ASCII, а UTF-8 переводит эти 128 символов Unicode в те же двоичные строки, что и ASCII. В результате UTF-8 может без проблем принимать текстовый файл, отформатированный с помощью ASCII, и преобразовывать его в читаемый человеком текст.
Символы UTF-8 в веб-разработке
UTF-8 — наиболее распространенный метод кодировки символов, используемый сегодня в Интернете, и набор символов по умолчанию для HTML5.Более 95% всех веб-сайтов, в том числе и ваш собственный, хранят персонажей таким образом. Кроме того, распространенные методы передачи данных через Интернет, такие как XML и JSON, кодируются стандартами UTF-8.
Поскольку в настоящее время это стандартный метод кодирования текста в Интернете, все страницы вашего сайта и базы данных должны использовать кодировку UTF-8. Система управления контентом или конструктор веб-сайтов по умолчанию сохранят ваши файлы в формате UTF-8, но все же рекомендуется убедиться, что вы придерживаетесь этой передовой практики.
Текстовые файлы с кодировкой UTF-8 должны указывать на это программному обеспечению, обрабатывающему их.В противном случае программа не сможет должным образом преобразовать двоичный код обратно в символы. В файлах HTML вы можете увидеть строку кода, подобную следующему, вверху:
Это сообщает браузеру, что файл HTML закодирован в UTF-8, чтобы браузер мог преобразовать его обратно в разборчивый текст.
UTF-8 против UTF-16
Как я уже упоминал, UTF-8 — не единственный метод кодирования для символов Unicode — существует также UTF-16.Эти методы различаются количеством байтов, необходимых для хранения символа. UTF-8 кодирует символ в двоичную строку из одного, двух, трех или четырех байтов. UTF-16 кодирует символ Unicode в строку из двух или четырех байтов.
Это различие видно из их названий. В UTF-8 наименьшее двоичное представление символа — это один байт или восемь битов. В UTF-16 наименьшее двоичное представление символа составляет два байта или шестнадцать бит.
И UTF-8, и UTF-16 могут переводить символы Unicode в удобные для компьютера двоичные файлы и обратно.Однако они несовместимы друг с другом. Эти системы используют разные алгоритмы для сопоставления кодовых точек с двоичными строками, поэтому двоичный вывод для любого заданного символа будет отличаться от обоих методов:
Знак | Двоичная кодировка UTF-8 | Двоичная кодировка UTF-16 |
А | 01000001 | 01000001 11011000 00001110 11011111 |
𠜎 | 11110000 10100000 10011100 10001110 | 01000001 11011000 00001110 11011111 |
UTF-8 предпочтительнее UTF-16 на большинстве веб-сайтов, поскольку она использует меньше памяти.Напомним, что UTF-8 кодирует каждый символ ASCII всего одним байтом. UTF-16 должен кодировать эти же символы в двух или четырех байтах. Это означает, что текстовый файл на английском языке с кодировкой UTF-16 будет как минимум в два раза больше размера того же файла с кодировкой UTF-8.
UTF-16 более эффективен, чем UTF-8, только на некоторых неанглоязычных сайтах. Если веб-сайт использует язык с символами, находящимися дальше в библиотеке Unicode, UTF-8 будет кодировать все символы как четыре байта, тогда как UTF-16 может кодировать многие из тех же символов только как два байта.Тем не менее, если ваши страницы заполнены буквами ABC и 123, придерживайтесь UTF-8.
Расшифровка мира кодировки UTF-8
Это было много слов о словах, поэтому давайте резюмируем то, что мы рассмотрели:
- Компьютеры хранят данные, включая текстовые символы, как двоичные (единицы и нули).
- ASCII был ранним способом кодирования или отображения символов в двоичный код, чтобы компьютеры могли их хранить. Однако в ASCII не было достаточно места для представления нелатинских символов и чисел в двоичном формате.
- Unicode был решением этой проблемы. Unicode присваивает уникальный «код» каждому символу на каждом человеческом языке.
- UTF-8 — это метод кодировки символов Юникода. Это означает, что UTF-8 берет кодовую точку для данного символа Юникода и переводит ее в строку двоичного кода. Он также делает обратное, считывая двоичные цифры и преобразуя их обратно в символы.
- UTF-8 в настоящее время является самым популярным методом кодирования в Интернете, поскольку он может эффективно хранить текст, содержащий любые символы.
- UTF-16 — еще один метод кодирования, но он менее эффективен для хранения текстовых файлов (за исключением тех, которые написаны на некоторых неанглийских языках).
Перевод Unicode — это не то, о чем большинству из нас нужно думать при просмотре или разработке веб-сайтов, и именно в этом суть — создать бесшовную систему обработки текста, которая работает для всех языков и веб-браузеров. Если он работает хорошо, вы этого не заметите.
Но если вы обнаружите, что страницы вашего веб-сайта занимают чрезмерно много места или если ваш текст усеян буквами и, пора применить ваши новые знания о UTF-8.
Кодировок символов для начинающих
Во-первых, какое мне дело?
Если вы используете что-либо, кроме самого основного текста на английском языке, люди не смогут прочитать созданный вами контент. если вы не укажете, какую кодировку символов вы использовали.
Например, вы можете сделать так, чтобы текст выглядел так:
, но на самом деле он может отображаться так:
Отсутствие информации о кодировке символов не только ухудшает читаемость отображаемого текста, но также может означать, что ваши данные не могут быть найдены поисковой системой или надежно обрабатывается машинами другими способами.
Так что за кодировка символов?
Слова и предложения в тексте состоят из символов . Примеры символов включают латинскую букву á, китайскую идеограмму 請 или символ деванагари ह.
Возможно, вы не сможете увидеть некоторые символы на этой странице, потому что у вас нет необходимых шрифтов. Если вы нажмете на то место, где вы ожидали увидеть персонажа, вы перейдете к графической версии. Эта страница закодирована в UTF-8.
Персонажи, необходимые для определенной цели, сгруппированы в набор символов (также называемый репертуаром ). (Чтобы однозначно обозначать символы, каждый символ связан с числом, называемым кодовой точкой .)
Символы хранятся в компьютере как один или несколько байтов .
В принципе, вы можете визуализировать это, предположив, что все символы хранятся в компьютерах с использованием специального кода, как шифры, используемые в шпионаже.Кодировка символов предоставляет ключ для разблокировки (т. Е. Взлома) кода. Это набор соответствий между байтами в компьютере и символами в наборе символов. Без ключа данные выглядят как мусор.
Вводящий в заблуждение термин кодировка часто используется для обозначения того, что на самом деле является кодировкой символов. Вам следует помните об этом использовании, но всегда старайтесь использовать термины кодировки символов.
Итак, когда вы вводите текст с клавиатуры или каким-либо другим способом, кодировка символов сопоставляет выбранные вами символы с конкретными байтами в памяти компьютера, а затем для отображения текста считывает байты обратно в символы.
К сожалению, существует много разных наборов символов и кодировок символов, т.е. много разных способов сопоставления байтов, кодовые точки и символы. В разделе «Дополнительная информация» для тех, кому интересно, чуть подробнее.
Однако в большинстве случаев вам не нужно знать подробности. Вам просто нужно быть уверенным, что вы прислушиваетесь к советам в раздел Как это влияет на меня? ниже.
Как в это вписываются шрифты?
Шрифт — это набор определений глифов, т.е.определения форм, используемых для отображения символов.
Как только ваш браузер или приложение определит, с какими символами имеет дело, оно будет искать в шрифте глифы, которые можно использовать для отображения. или распечатайте эти символы. (Конечно, если информация о кодировке была неправильной, она будет искать глифы для неправильных символов.)
Данный шрифт обычно покрывает один набор символов или, в случае большого набора символов, например Unicode, только подмножество всех персонажей в наборе.Если в вашем шрифте нет глифа для определенного символа, некоторые браузеры или программные приложения будут искать недостающие глифы в других шрифты в вашей системе (что будет означать, что глиф будет отличаться от окружающего текста, как записка с требованием выкупа). В противном случае вы обычно вместо этого вы увидите квадратную рамку, вопросительный знак или какой-либо другой символ. Например:
Как это повлияет на меня?
Как автор или разработчик контента, в настоящее время вы всегда должны выбирать UTF-8 кодировка символов для вашего контента или данных.Эта кодировка Unicode — хороший выбор, потому что вы можете использовать односимвольную кодировку для обработки любого символа, который вам может понадобиться. Это значительно упрощает работу. Использование Unicode во всей вашей системе также устраняет необходимость отслеживать и конвертировать между различными кодировками символов.
Авторы контента должны узнать, как объявить персонажа кодировка, используемая для формата документа, с которым они работают.
Обратите внимание, что просто объявление другой кодировки на вашей странице не изменит байты; вам нужно сохранить текста и в этой кодировке.
Как автор контента, вам необходимо проверить, в какой кодировке ваш редактор или скрипты сохраняют текст и как сохранять текст в UTF-8. (В наши дни это обычно используется по умолчанию.) Вам также может потребоваться проверить, что ваш сервер обслуживает документы с правильным HTTP декларации.
Разработчикам необходимо убедиться, что различные части системы могут взаимодействовать друг с другом, понимать, какие кодировки символов используются и поддерживают все необходимые кодировки и символы.(В идеале вы должны использовать UTF-8 повсюду и избавиться от этой проблемы.)
По ссылкам ниже можно найти дополнительную информацию по этим темам.
Этот раздел предоставляет небольшую дополнительную информацию о сопоставлении байтов, кодовых точек и символов для тех, кому это интересно. Не стесняйтесь просто перейти к разделу Дополнительная литература.
Обратите внимание, что номера кодовых точек обычно выражаются в шестнадцатеричной системе счисления, т.е. основание 16. Например, 233 в шестнадцатеричной форме — это E9.Значения кодовой точки Unicode обычно записываются в форме U + 00E9.
В наборе кодированных символов под названием ISO 8859-1 (также известном как Latin1) значение десятичной кодовой точки для буквы é равно 233. Однако в ISO 8859-5, та же кодовая точка представляет кириллический символ щ.
Эти наборы символов содержат менее 256 символов и напрямую сопоставляют кодовые точки с байтовыми значениями, поэтому кодовая точка со значением 233 представлена одним байтом со значением 233.Обратите внимание, что только контекст определяет, представляет ли этот байт либо é, либо щ.
Есть и другие способы работы с символами из ряда скриптов. Например, с набором символов Unicode вы можете представить оба символа в одном наборе. Фактически, Юникод содержит в одном наборе, вероятно, все символы, которые вам когда-либо понадобятся. Хотя буква é по-прежнему представлена значением кодовой точки 233, кириллический символ щ теперь имеет значение кодовой точки 1097.
С другой стороны, 1097 слишком большое число, чтобы его можно было представить одним байт*. Итак, если вы используете кодировку символов для текста Unicode под названием UTF-8, щ будет представлен двумя байтами. Тем не менее значение кодовой точки не просто выводится из значения двух байтов, соединенных вместе — требуется более сложное декодирование.
Другой Unicode символы отображаются в один, три или четыре байта в кодировке UTF-8.
Кроме того, обратите внимание, что буква é также представлена двумя байтами в UTF-8, а не одним байтом, используемым в ISO 8859-1. (Только символы ASCII кодируются одним байтом в UTF-8.)
UTF-8 — это наиболее широко используемый способ представления текста Unicode на веб-страницах, и вы всегда должны использовать UTF-8 при создании веб-страниц и баз данных. Но, в принципе, UTF-8 — лишь один из возможных способов кодирования. Символы Юникода. Другими словами, одна кодовая точка в наборе символов Unicode может фактически отображаться в разные последовательности байтов, в зависимости от какая кодировка использовалась для документа.Кодовые точки Unicode могут быть сопоставлены с байтами с использованием любой из кодировок, называемых UTF-8, UTF-16 или UTF-32. Символ деванагари क с кодовой точкой 2325 (что составляет 915 в шестнадцатеричной системе счисления) будет представлен двумя байтов при использовании кодировки UTF-16 (09 15), трех байтов с UTF-8 (E0 A4 95) или четырех байтов с UTF-32 (00 00 09 15).
Могут быть и другие сложности помимо описанных в этом разделе (например, порядок байтов и escape-последовательности), но детали описанное здесь показывает, почему важно, чтобы приложение, с которым вы работаете, знало, какая кодировка символов подходит для ваших данных, и знает, как обрабатывать эту кодировку.
UTF-8 Кодировка
Сводка
UTF-8 — это компромиссная кодировка символов, которая может быть столь же компактной как ASCII (если файл представляет собой обычный текст на английском языке), но также может содержать любые символы юникода (с некоторым увеличением размера файла).
UTF означает формат преобразования Unicode. ‘8’ означает, что он использует 8-битные блоки для представляют собой персонажа. Количество блоков, необходимых для представления персонажа, варьируется от От 1 до 4.
Одной из действительно хороших особенностей UTF-8 является то, что он совместим со строками с завершающим нулем.При кодировании ни один символ не будет иметь нулевой (0) байт. Это означает, что код C, имеющий дело с char [] будет «просто работать».
Вы можете попробовать тестовую страницу UTF-8, чтобы увидеть, насколько хорошо ваш браузер (и шрифт по умолчанию) поддерживает UTF-8.
Если вы разработчик приложений, эта статья Joel On Software о Unicode — довольно хорошее резюме всего, что вам нужно знать.
Дополнительные ссылки:
Деталь
Для любого символа, равного или меньше 127 (шестнадцатеричный 0x7F), представление UTF-8 это один байт.Это всего лишь младшие 7 бит полного значения Unicode. Это также то же самое, что и значение ASCII.
Для символов, равных или меньше 2047 (шестнадцатеричное 0x07FF), представление UTF-8 распространяется на два байта. В первом байте будут установлены два старших бита и третий бит очищен (т.е. от 0xC2 до 0xDF). Второй байт будет иметь установлен верхний бит, а второй бит очищен (например, от 0x80 до 0xBF).
Для всех символов, равных или больше 2048, но меньше 65535 (0xFFFF), представление UTF-8 распространяется на три байта.
В следующей таблице показан формат таких байтовых последовательностей UTF-8 (где «свободные биты», обозначенные в таблице значками x, объединяются в порядок показан и интерпретируется от наиболее значимого до наименее значимого).
Двоичный формат байтов в последовательности
1-й байт | 2-й байт | 3-й байт | 4-й байт | Количество свободных битов | Максимальное выражаемое значение Юникода |
---|---|---|---|---|---|
0xxxxxxx | 7 | 007F шестигранник (127) | |||
110xxxxx | 10xxxxxx | (5 + 6) = 11 | 07FF шестигранник (2047) | ||
1110xxxx | 10xxxxxx | 10xxxxxx | (4 + 6 + 6) = 16 | FFFF шестигранник (65535) | |
11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | (3 + 6 + 6 + 6) = 21 | 10FFFF шестигранник (1,114,111) |
Значение каждого отдельного байта указывает его функцию UTF-8, как показано ниже:
- От 00 до 7F шестнадцатеричное (от 0 до 127): первый и единственный байт последовательности.
- от 80 до BF шестнадцатеричный (от 128 до 191): продолжающий байт в многобайтовой последовательности.
- C2 в шестнадцатеричный формат DF (194–223): первый байт двухбайтовой последовательности.
- E0 в шестнадцатеричном формате EF (от 224 до 239): первый байт трехбайтовой последовательности.
- F0 — FF шестнадцатеричный (от 240 до 255): первый байт четырехбайтовой последовательности.
UTF-8 остается простым однобайтовым, совместимым с ASCII методом кодирования до тех пор, пока непосредственно присутствуют символы больше 127. Это означает, что документ HTML технически объявленный как закодированный как UTF-8, может оставаться обычным однобайтовым файлом ASCII.Документ может остаться поэтому, даже если он может содержать символы Unicode выше 127, при условии, что все символы выше 127 упоминаются косвенно с помощью амперсандных сущностей.
Примеры закодированных символов Unicode (в шестнадцатеричной системе счисления)
16-битный Unicode | Последовательность UTF-8 |
---|---|
0001 | 01 |
007F | 7F |
0080 | C2 80 |
07FF | DF BF |
0800 | E0 A0 80 |
FFFF | EF BF BF |
010000 | F0 90 80 80 |
10FFFF | F4 8F BF BF |
Изменение данных WRDS на UTF-8
WRDS будет преобразовывать все данные из Latin1 в UTF-8 в понедельник, 16 ноября
Фон
Английский алфавит, цифры и основные символы можно просматривать с помощью системы, называемой кодировкой Latin1 .Такие языки, как испанский, немецкий и другие, добавляют дополнительные символы и символы, не являющиеся частью Latin1. Китайский алфавит и другие вообще не используют Latin1. Эти символы и символы являются частью гораздо более крупной системы кодирования под названием UTF8 , которая также включает Latin1.
С момента создания WRDS все наши данные хранились в кодировке Latin1. Поскольку WRDS становится все более глобальным по своему охвату и становится более текстовым, необходимость перехода на кодировку UTF-8 становится очевидной.Изменив нашу базовую кодировку на UTF-8, мы сможем сохранить все нелатинские символы — это будет означать, что вы больше не будете видеть случайные, странно выглядящие символы в местах, где должен присутствовать допустимый нелатинский символ.
Что мне нужно делать?
В подавляющем большинстве случаев ничего делать не нужно . Переход на кодировку UTF-8 должен быть плавным и незаметным. На все веб-запросы это не повлияет, и они продолжат работу, как ожидалось.В большинстве случаев вам не нужно изменять какой-либо из существующего кода, однако есть некоторые крайние случаи, которые могут временно потребовать корректировки ваших операторов libname
, как подробно описано ниже.
SAS / Использование подключения
Если вы используете SAS / Connect, вы должны подключиться к версии unicode / UTF-8 клиента SAS, по умолчанию используется Latin1. В unix-подобных системах это команда sas_u8
. В Windows необходимо запустить приложение SAS 9.4 (поддержка Unicode)
.Если вы не используете версию Unicode, вы увидите следующее предупреждение: Предупреждение: код сеанса клиента latin1 несовместим с кодировкой сеанса сервера UTF-8. Данные могут передаваться некорректно.
Затронутые платформы
Все методы доступа к данным (веб-запрос, SAS, Python, доступ к API, запуск кода в облаке WRDS и т. Д.) Будут использовать данные в кодировке UTF-8 после миграции.
Потенциальное влияние на производительность / ошибки кодирования
Как уже упоминалось, в большинстве случаев существующий код или сохраненные наборы данных не должны ломаться из-за миграции.Однако есть некоторые крайние случаи, когда вы можете заметить влияние на производительность — или даже ошибку — в частности:
- Если у вас есть ранее сохраненный набор данных в вашем домашнем каталоге и вы используете собственный код для присоединения этих данных к данным WRDS , может быть несоответствие между кодировками набора данных после перехода на UTF-8, и SAS не будет использовать какие-либо индексы для запроса данных. Хотя код все еще должен работать, вы можете заметить снижение производительности и сообщение, подобное этому, в вашем журнале:
ПРИМЕЧАНИЕ. Файл данных MYLIB.MYFILE.DATA находится в формате, который является собственным для другого хоста, или кодировка файла не соответствует кодировке сеанса. Будет использоваться доступ к данным между средами, что может потребовать дополнительных ресурсов ЦП и снизить производительность.
- Объявление пользовательских имен библиотек в коде, которые ссылаются на данные WRDS, потенциально может быть проблематичным. Например, при объявлении таких библиотек, как
libnamecompib '/ wrds / comp / sasdata / d_na /';
Есть несколько простых обходных путей, которые можно использовать, чтобы разрешить SAS читать индекс и не использовать CEDA (доступ к данным между средами), что снижает производительность:
- Option 1: Add «inencoding = asciiany «к вашим пользовательским операторам libname.В вашем коде SAS, где вы указываете библиотеку для сохраненных данных, или если у вас есть пользовательские операторы libname, ссылающиеся на данные WRDS, просто добавьте параметр inencoding = asciiany в конец операторов, например:
libname mylib '~ / 'inencoding = asciiany;
имя библиотеки compib '/ wrds / comp / sasdata / d_na /' inencoding = asciiany; - Вариант 2: Измените кодировку сохраненного набора данных на UTF-8, чтобы он соответствовал кодировке данных WRDS. Вы можете изменить кодировку набора данных на формат UTF-8 с помощью следующего кода:
proc datasets nolist library = mylib;
изменить mydata / correctencoding = utf8;
бросили;
Все новые наборы данных, созданные после миграции, по умолчанию будут иметь кодировку UTF-8.
Верх
Encoding 101 — Часть 2: Windows-1252 против UTF-8
Продолжение с Кодировка 101 часть 1
Во второй части будут представлены две наиболее распространенные кодировки, используемые сегодня, и рассмотрены некоторые из их различий.
Различия между разными кодировками
Если бы в свое время вся ИТ-индустрия согласилась на единое кодирование, сейчас с этим было бы гораздо легче справиться.Тем не менее, это не так. На протяжении многих лет различные компании ставили перед собой задачу решить одну и ту же проблему: как представить текст в виде двоичных данных для хранения или передачи. В результате сегодня существует огромное количество систем кодирования. К сожалению, многие из них почти идентичны, что заставляет усомниться в необходимости их существования еще больше.
Многие современные кодировки основаны на кодировке ASCII, но расширяют ее, чтобы включить больше символов. Это означает, что текст, который содержит только символы, присутствующие в стандарте ASCII, часто также может быть декодирован как ASCII, даже если технически он закодирован с использованием другого стандарта.Это связано с тем, что многие более крупные кодировки по-прежнему используют те же коды, что и ASCII для первых 128 символов, но помимо этих символов эти схемы кодирования отличаются в большей или меньшей степени.
Давайте сравним две наиболее распространенные кодировки, используемые для западных языков, Windows-1252 и UTF-8.
Окна-1252
Это кодировка по умолчанию, используемая системами Windows в большинстве западных стран. Это означает, что текстовые данные, созданные программным обеспечением, работающим в таких системах по умолчанию, будут использовать кодировку Windows-1252, если явно не установлено использование другой кодировки.Некоторое программное обеспечение позволяет пользователю выбирать, какую кодировку использовать, некоторые настроены на использование определенной кодировки, а не по умолчанию, а некоторые оставляют это на усмотрение самой системы.
Windows-1252 — это однобайтовая кодировка, что означает, что каждый символ кодируется как однобайтный, так же, как и в ASCII. Однако, поскольку Windows-1252 использует полные 8 бит каждого байта для своих кодовых точек (в отличие от 7-битных кодов ASCII), она содержит 256 кодовых точек по сравнению с 128 ASCII. Первая половина кодовых точек идентична те, которые определены в ASCII, а вторая половина кодирует дополнительные символы, которых нет в наборе символов ASCII.
UTF-8
UTF-8 — это кодировка из стандарта Unicode. UTF означает формат преобразования Unicode, а цифра 8 в конце означает, что это 8-битная кодировка переменной. Это означает, что каждый символ использует не менее 8 бит для своей кодовой точки, но некоторые могут использовать больше. Как и в Windows-1252, первые 128 кодовых точек идентичны ASCII, но выше эти две кодировки значительно отличаются. В то время как Windows-1252 содержит всего 256 кодовых точек, UTF-8 имеет кодовые точки для всего набора символов Unicode.Это делается путем определения некоторых байтовых значений выше 127 в качестве префиксов для дальнейших байтовых значений. Например, символ авторского права (©) кодируется как C2 A9, а знак фунта (£) кодируется как C2 A3. Поскольку байт C2 разработан как байт префикса, это открывает дополнительные 256 2-байтовых кодовых точек с C2 в качестве первого байта.
Такой дизайн означает, что большинство обычных символов, используемых в западных языках, занимают только один байт пространства, в то время как многобайтовые кодировки используются реже.В результате UTF-8 может кодировать любой символ, сохраняя при этом относительно небольшой размер данных. Это полезно как для постоянного хранения (файлы небольшого размера), так и для передачи (например, открытия веб-страницы). Из-за этого UTF-8 в настоящее время является наиболее доминирующей кодировкой, используемой во всемирной паутине, и по состоянию на сентябрь 2019 года на ее долю приходилось 94% всех веб-страниц.
Сравнение кодировок
Давайте посмотрим на конкретном примере того, как эти две кодировки отличаются друг от друга. Мы будем использовать слово «Naïveté», которое содержит два символа, отличных от ASCII (у него есть альтернативные варианты написания без них, но пример — это признанное допустимое написание слова на английском языке).
Как мы видим, символы ï и é существуют в обеих кодировках, но кодируются двумя разными способами. В Windows-1252 все символы кодируются с использованием одного байта, поэтому кодировка содержит всего 256 символов. Однако в UTF-8 эти два символа кодируются с использованием 2 байтов каждый. В результате слово занимает на два байта больше при использовании кодировки UTF-8, чем при использовании кодировки Windows-1252.
Итак, разные кодировки обрабатывают одни символы по-разному.В следующей и третьей частях этой серии блогов мы рассмотрим, как это может вызвать у нас проблемы. Найдите здесь «Кодировку 101 — часть 3».
Кодировка— что такое Unicode, UTF-8, UTF-16?
Зачем нам Юникод?
В (не слишком) ранние дни все, что существовало, было ASCII. Это было нормально, поскольку все, что когда-либо понадобилось, — это несколько управляющих символов, знаков препинания, цифр и букв, подобных тем, что в этом предложении. К сожалению, сегодняшний странный мир глобального взаимодействия и социальных сетей не был предвиден, и нет ничего необычного в том, чтобы увидеть английский, العربية, 汉语, עִבְרִית, ελληνικά и ភាសាខ្មែរ в одном документе (надеюсь, я не сломал ни одного старого браузеры).
Но ради аргументации, допустим, Джо Средний — разработчик программного обеспечения. Он настаивает на том, что ему когда-либо понадобится только английский, и поэтому он хочет использовать только ASCII. Это может быть хорошо для Джо, пользователя , , но не для Джо, разработчика программного обеспечения . Примерно половина мира использует нелатинские символы, и использование ASCII, возможно, неосмотрительно для этих людей, и, кроме того, он закрывает свое программное обеспечение для большой и растущей экономики.
Следовательно, необходим всеобъемлющий набор символов, включающий для всех языков.Так появился Unicode. Он присваивает каждому символу уникальный номер, называемый кодовой точкой . Одним из преимуществ Unicode перед другими возможными наборами является то, что первые 256 кодовых точек идентичны ISO-8859-1 и, следовательно, также ASCII. Кроме того, подавляющее большинство обычно используемых символов представляются только двумя байтами в области, называемой Basic Multilingual Plane (BMP) . Теперь для доступа к этому набору символов необходима кодировка символов, и в ответ на вопрос, я сосредоточусь на UTF-8 и UTF-16.
Рекомендации по использованию памяти
Так сколько байтов к каким символам дают доступ в этих кодировках?
- UTF-8:
- 1 байт: стандартный ASCII
- 2 байта: арабский, иврит, большинство европейских алфавитов (в первую очередь за исключением грузинского)
- 3 байта: BMP
- 4 байта: все символы Unicode
- UTF-16:
- 2 байта: BMP
- 4 байта: все символы Unicode
Теперь стоит упомянуть, что символы, не входящие в BMP, включают древние шрифты, математические символы, музыкальные символы и более редкие символы китайского / японского / корейского (CJK).
Если вы будете работать в основном с символами ASCII, то UTF-8, безусловно, более эффективен с точки зрения памяти. Однако, если вы работаете в основном с неевропейскими скриптами, использование UTF-8 может быть в 1,5 раза менее эффективным с точки зрения памяти, чем UTF-16. При работе с большими объемами текста, такими как большие веб-страницы или длинные текстовые документы, это может повлиять на производительность.
Основы кодирования
Примечание. Если вы знаете, как кодируются UTF-8 и UTF-16, перейдите к следующему разделу, посвященному практическому применению.
- UTF-8: Для стандартных символов ASCII (0–127) коды UTF-8 идентичны. Это делает UTF-8 идеальным, если требуется обратная совместимость с существующим текстом ASCII. Для других символов требуется от 2 до 4 байтов. Это делается путем резервирования некоторых битов в каждом из этих байтов, чтобы указать, что он является частью многобайтового символа. В частности, первый бит каждого байта —
1
, чтобы избежать конфликтов с символами ASCII. - UTF-16: Для допустимых символов BMP представление UTF-16 — это просто его кодовая точка.Однако для символов, отличных от BMP, UTF-16 вводит суррогатных пар . В этом случае комбинация двух двухбайтовых частей отображается на символ, отличный от BMP. Эти двухбайтовые части берутся из числового диапазона BMP, но стандарт Unicode гарантирует их недопустимость в качестве символов BMP. Кроме того, поскольку UTF-16 имеет два байта в качестве основной единицы, на него влияет порядок байтов. Для компенсации зарезервированная метка порядка байтов может быть размещена в начале потока данных, что указывает на порядок байтов.Таким образом, если вы читаете ввод UTF-16, а порядок байтов не указан, вы должны это проверить.
Как видно, UTF-8 и UTF-16 несовместимы друг с другом. Поэтому, если вы выполняете ввод-вывод, убедитесь, что вы знаете, какую кодировку вы используете! Дополнительные сведения об этих кодировках см. В разделе часто задаваемых вопросов по UTF.
Практические рекомендации по программированию
Символьные и строковые типы данных: Как они закодированы в языке программирования? Если это необработанные байты, в ту минуту, когда вы попытаетесь вывести символы, отличные от ASCII, вы можете столкнуться с несколькими проблемами.Кроме того, даже если тип символа основан на UTF, это не означает, что строки являются правильным UTF. Они могут допускать недопустимые последовательности байтов. Как правило, вам придется использовать библиотеку, поддерживающую UTF, например ICU для C, C ++ и Java. В любом случае, если вы хотите вводить / выводить что-то отличное от кодировки по умолчанию, вам сначала нужно будет ее преобразовать.
Рекомендуемые / стандартные / доминирующие кодировки: Когда есть выбор, какой UTF использовать, обычно лучше следовать рекомендованным стандартам для среды, в которой вы работаете.Например, UTF-8 является доминирующим в Интернете, а начиная с HTML5, это рекомендуемая кодировка. И наоборот, как среды .NET, так и Java основаны на символьном типе UTF-16. Как это ни сбивает с толку (и неправильно), часто делаются ссылки на «кодировку Unicode», которая обычно относится к доминирующей кодировке UTF в данной среде.
Поддержка библиотек: Используемые библиотеки поддерживают некоторую кодировку. Который из? Поддерживают ли они угловые случаи? Поскольку необходимость — мать изобретения, библиотеки UTF-8, как правило, будут правильно поддерживать 4-байтовые символы, поскольку часто могут встречаться 1, 2 и даже 3-байтовые символы.Однако не все предполагаемые библиотеки UTF-16 поддерживают суррогатные пары должным образом, поскольку они встречаются очень редко.
Подсчет символов: Существуют , объединяющие символов в Unicode. Например, кодовая точка U + 006E (n) и U + 0303 (объединяющая тильда) образует ñ, а кодовая точка U + 00F1 образует ñ. Они должны выглядеть одинаково, но простой алгоритм подсчета вернет 2 в первом примере и 1 во втором. Это не обязательно неправильно, но может и не быть желаемым результатом.
Сравнение на равенство: A, А и Α выглядят одинаково, но они латынь, кириллица и греческий соответственно. У вас также есть падежи, такие как C и Ⅽ, одна буква, другая римская цифра. Кроме того, нам нужно учитывать и комбинирующие символы. Для получения дополнительной информации см. Дублирующиеся символы в Юникоде.
Суррогатных пар: Они достаточно часто встречаются на SO, поэтому я просто приведу несколько примеров ссылок:
Другое ?:
Кодировка— В чем разница между UTF-8 и Unicode?
В дополнение к другим ответам:
У нас есть много языков с большим количеством символов, которые компьютеры должны идеально отображать.Unicode присваивает каждому символу уникальный номер или кодовую точку.
Компьютеры имеют дело с такими числами, как байты … пропуская здесь немного истории и игнорируя проблемы с адресацией памяти, 8-битные компьютеры будут рассматривать 8-битный байт как самую большую числовую единицу, легко представленную на оборудовании, 16-битные компьютеры будут расширите это до двух байтов и так далее.
Старые кодировки символов, такие как ASCII, относятся к (до) 8-битной эпохе и пытаются втиснуть доминирующий язык в вычислениях того времени, т.е.е. Английский, в числах от 0 до 127 (7 бит). С 26 буквами в алфавите, как заглавными, так и заглавными, числами и знаками препинания, это работало очень хорошо. ASCII был расширен на 8-й бит для других, отличных от английского языков, но дополнительные 128 чисел / кодовых точек, предоставляемые этим расширением, будут сопоставлены с разными символами в зависимости от отображаемого языка. Стандарты ISO-8859 являются наиболее распространенными формами этого сопоставления; ISO-8859-1 и ISO-8859-15 (также известные как ISO-Latin-1, latin1, и да, есть две разные версии стандарта 8859 ISO).
Но этого недостаточно, если вы хотите представить символы из более чем одного языка, поэтому втиснуть все доступные символы в один байт просто не получится.
По сути, существует два разных типа кодирования: один расширяет диапазон значений, добавляя дополнительные биты. Примерами этих кодировок могут быть UCS2 (2 байта = 16 бит) и UCS4 (4 байта = 32 бита). По сути, они страдают той же проблемой, что и стандарты ASCII и ISO-8859, поскольку их диапазон значений все еще ограничен, даже если предел значительно выше.
Другой тип кодирования использует переменное количество байтов на символ, и наиболее широко известными кодировками для этого являются кодировки UTF. Все кодировки UTF работают примерно одинаково: вы выбираете размер блока, который для UTF-8 составляет 8 бит, для UTF-16 — 16 бит, а для UTF-32 — 32 бит. Затем стандарт определяет некоторые из этих битов как флаги: если они установлены, то следующая единица в последовательности единиц должна считаться частью того же символа. Если они не установлены, эта единица полностью представляет один символ.Таким образом, наиболее распространенные (английские) символы занимают только один байт в UTF-8 (два в UTF-16, 4 в UTF-32), но символы других языков могут занимать шесть байтов и более.
Многобайтовые кодировки (после приведенного выше объяснения я бы сказал, что это многозначные) имеют то преимущество, что они относительно компактны, но обратная сторона заключается в том, что такие операции, как поиск подстрок, сравнения и т.д., все должны декодировать символы в Unicode кодовые точки до того, как такие операции могут быть выполнены (хотя есть некоторые ярлыки).
Как стандарты UCS, так и стандарты UTF кодируют кодовые точки, как определено в Unicode. Теоретически эти кодировки могут использоваться для кодирования любого числа (в пределах диапазона, поддерживаемого кодированием), но, конечно, эти кодировки были сделаны для кодирования кодовых точек Unicode. И это ваши отношения между ними.
Windows обрабатывает так называемые строки «Unicode» как строки UTF-16, в то время как большинство UNIX в наши дни по умолчанию используют UTF-8. Протоколы связи, такие как HTTP, как правило, лучше всего работают с UTF-8, поскольку размер блока в UTF-8 такой же, как и в ASCII, и большинство таких протоколов были разработаны в эпоху ASCII.С другой стороны, UTF-16 дает лучшую , среднюю производительность памяти / обработки при представлении всех живых языков.
Стандарт Unicode определяет меньше кодовых точек, чем может быть представлено в 32 битах.