DataView
DataView – это специальное супергибкое нетипизированное представление данных из . Оно позволяет обращаться к данным на любой позиции и в любом формате.
- В случае типизированных массивов конструктор строго задаёт формат данных. Весь массив состоит из однотипных значений. Доступ к i-ому элементу можно получить как .
- В случае доступ к данным осуществляется посредством методов типа или . Мы выбираем формат данных в момент обращения к ним, а не в момент их создания.
Синтаксис:
- – ссылка на бинарные данные . В отличие от типизированных массивов, не создаёт буфер автоматически. Нам нужно заранее подготовить его самим.
- – начальная позиция данных для представления (по умолчанию 0).
- – длина данных (в байтах), используемых в представлении (по умолчанию – до конца ).
Например, извлечём числа в разных форматах из одного и того же буфера двоичных данных:
Представление отлично подходит, когда мы храним данные разного формата в одном буфере. Например, мы храним последовательность пар, первое значение пары 16-битное целое, а второе – 32-битное с плавающей точкой. позволяет легко получить доступ к обоим.
Кодирование меток с использованием Python
Библиотека sklearn Python предлагает пользователям предварительно определенные функции для работы с Label Encoding в наборе данных.
Синтаксис:
from sklearn import preprocessing obj = preprocessing.LabelEncoder()
Как мы видим, мы создали объект класса LabelEncoder, а затем использовали этот объект для применения кодировки метки к данным.
В основном существует два способа кодирования меток:
- LabelEncoder с помощью библиотеки scikit-learn
- Коды категорий.
Кодирование меток с использованием библиотеки scikit-learn
Начнем с процесса кодирования меток. Первичный шаг для кодирования набора данных – получить набор данных.
Итак, мы создали здесь простой набор данных:
import pandas as pd my_data = { "Gender" : , "Name" : } blk = pd.DataFrame(my_data) print("Geniune Data Frame:\n") print(blk)
Мы создали словарь «данные» и преобразовали его в фрейм данных с помощью функции DataFrame().
Выход:
Geniune Data Frame: Gender Name 0 F Cindy 1 M Carl 2 M Johnny 3 F Stacey 4 M Andy 5 F Sara 6 M Victor 7 F Martha 8 F Mindy 9 M Max
Как мы можем видеть из вышеприведенного набора данных, у нас есть переменная с названием «Пол», которая имеет метки «F» и «M» соответственно.
Двигаясь вперед, давайте попробуем импортировать класс LabelEncoder. Затем мы применим класс к переменной «Пол» набора данных.
Пример:
import pandas as pd from sklearn import preprocessing my_data = { "Gender" : , "Name" : } blk = pd.DataFrame( my_data ) print("Geniune Data Frame:\n") print( blk ) my_label = preprocessing.LabelEncoder() blk= my_label.fit_transform(blk) print(blk.unique()) print("Data Frame after Label Encoding:\n") print( blk )
Выход:
Geniune Data Frame: Gender Name 0 F Cindy 1 M Carl 2 M Johnny 3 F Stacey 4 M Andy 5 F Sara 6 M Victor 7 F Martha 8 F Mindy 9 M Max Data Frame after Label Encoding: Gender Name 0 0 Cindy 1 1 Carl 2 1 Johnny 3 0 Stacey 4 1 Andy 5 0 Sara 6 1 Victor 7 0 Martha 8 0 Mindy 9 1 Max
Объяснение:
В приведенном выше примере мы импортировали pandas и модули предварительной обработки библиотеки scikit-learn. Затем мы определили данные как словарь и распечатали фрейм данных для справки.
Позже мы использовали метод fit_transform(), чтобы добавить функциональность кодировщика меток, на которую указывает объект, в переменную данных. Мы напечатали уникальный код в отношении пола и окончательного фрейма данных после выполнения кодирования метки.
Забегая вперед, давайте обсудим еще один метод кодирования меток с помощью кодов категорий.
С использованием кодов категорий
Прежде чем мы перейдем к процессу кодирования меток с использованием кодов категорий, давайте проверим типы данных переменных набора данных.
Мы можем проверить тип данных с помощью функции dtypes, как показано ниже:
import pandas as pd my_data = { "Gender" : , "Name" : } blk = pd.DataFrame( my_data ) print( blk.dtypes )
Выход:
Gender object Name object dtype: object
После того, как мы проверили тип данных переменной «Пол», мы преобразуем его в тип категории.
Это можно увидеть в следующем фрагменте кода:
import pandas as pd my_data = { "Gender" : , "Name" : } blk = pd.DataFrame( my_data ) blk = blk.astype( 'category' ) print( blk.dtypes )
Выход:
Gender category Name object dtype: object
Теперь давайте попробуем преобразовать метки в целочисленные типы с помощью функции pandas.DataFrame.cat.codes. Вот полный пример, основанный на кодировании меток с использованием кодов категорий:
import pandas as pd my_data = { "Gender" : , "Name" : } blk = pd.DataFrame( my_data ) print("Genuine Data Frame:\n") print( blk ) blk = blk.astype( 'category' ) print("\nData Frame after Label Encoding using Category codes:\n") blk = blk.cat.codes print( blk )
Выход:
Genuine Data Frame: Gender Name 0 F Cindy 1 M Carl 2 M Johnny 3 F Stacey 4 M Andy 5 F Sara 6 M Victor 7 F Martha 8 F Mindy 9 M Max Data Frame after Label Encoding using Category codes: Gender Name 0 0 Cindy 1 1 Carl 2 1 Johnny 3 0 Stacey 4 1 Andy 5 0 Sara 6 1 Victor 7 0 Martha 8 0 Mindy 9 1 Max
Объяснение:
В приведенном выше примере мы импортировали библиотеку pandas и определили данные как словарь. Затем мы распечатали исходный фрейм данных для справки. После этого мы преобразовали тип данных переменной «Пол» в категорию и использовали функцию pandas.DataFrame.cat.codes, чтобы преобразовать его в коды категорий. Наконец, мы распечатали результат после кодирования метки с использованием кодов категорий.
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.
Методы TypedArray
Типизированные массивы , за некоторыми заметными исключениями, имеют те же методы, что и массивы .
Мы можем обходить их, вызывать , , , и т.д.
Однако, есть некоторые вещи, которые нельзя осуществить:
- Нет метода – мы не можем удалять значения, потому что типизированные массивы – это всего лишь представления данных из буфера, а буфер – это непрерывная область памяти фиксированной длины. Мы можем только записать 0 вместо значения.
- Нет метода .
Но зато есть два дополнительных метода:
- копирует все элементы из в , начиная с позиции (0 по умолчанию).
- создаёт новое представление того же типа для данных, начиная с позиции до (не включая). Это похоже на метод (который также поддерживается), но при этом ничего не копируется – просто создаётся новое представление, чтобы совершать какие-то операции над указанными данными.
Эти методы позволяют нам копировать типизированные массивы, смешивать их, создавать новые на основе существующих и т.д.
Шифрование¶
Шифр Цезаря
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом вправо на 3, A была бы заменена на D, B станет E, и так далее.
Повторить шифр можно в занятии
Формула для кодирования символа:
symbol_encoded = ((((symbol) - first + key) % size) + first)
Шифр пар
Алфавит случайным образом записывают в 2 строки, и шифрование текста происходит заменой буквы на соседнюю ей по вертикали.
Например:
'v', 'q', 'f', 's', 'p', 'u', 'n', 'a', 'm', 'j', 'c', 'k', 'h' 'l', 'r', 'o', 'e', 'x', 'd', 'z', 'g', 'b', 'w', 't', 'i', 'y' In hello Out ysvvf
Шифр Виженера
На алфавите длиной N вводят операцию добавления (циклического сдвига) букв.
Пронумеровав буквы, добавляем их по модулю N (для англ. алфавита N=26).
Выбираем слово-ключ (пускай pass) и подписываем его под сообщением сколько нужно раз:
Скалярные значения Юникода
Термин относится ко всем кодовым точкам, кроме суррогатных. Другими словами, скалярное значение — это любая кодовая точка, которой присвоен символ или которой может быть присвоен символ в будущем. Слово «символ» здесь относится ко всему, что может быть назначено кодовой точке, включая действия, которые определяют способ отображения текста или символов.
На приведенной ниже схеме показаны точки кода скалярного значения.
Тип Rune как скалярное значение
Начиная с версии .NET Core 3.0, тип System.Text.Rune представляет скалярное значение Юникода. Тип недоступен в .NET Core 2.x или .NET Framework 4.x.
Конструкторы проверяют, является ли полученный экземпляр допустимым скалярным значением Юникода. В противном случае они создают исключение. В следующем примере показан код, который создает экземпляры , так как входные данные представляют допустимые скалярные значения:
В следующем примере создается исключение, так как кодовая точка находится в суррогатном диапазоне и не является частью суррогатной пары:
В следующем примере создается исключение, так как кодовая точка находится за пределами дополнительного диапазона:
Пример использования Rune: изменение регистра букв
API, который принимает и предполагает, что работает с кодовой точкой, которая является скалярным значением, работает неправильно, если принадлежит суррогатной паре. Например, рассмотрим следующий метод, который вызывает Char.ToUpperInvariant для каждого экземпляра char в string:
Если string содержит строчную букву дезерет (), этот код не преобразует ее в прописную букву (). Код вызывает отдельно для каждой суррогатной кодовой точки и . Однако в самой кодовой точке информации недостаточно, чтобы идентифицировать ее как строчную букву. Таким образом оставляет ее как есть. И таким же образом обрабатывает . В результате буква «𐑉» нижнего регистра в string не преобразуется в букву «𐐡» верхнего регистра.
Вот два варианта правильного преобразования string в верхний регистр:
-
Вызовите String.ToUpperInvariant для входного экземпляра string, а не в итерации -by-. Метод имеет доступ к обеим частям каждой суррогатной пары, поэтому он может правильно обрабатывать все кодовые точки Юникода.
-
Выполните итерацию скалярных значений Юникода в качестве экземпляров , а не экземпляров , как показано в следующем примере. Так как экземпляр является допустимым скалярным значением Юникода, его можно передать в API-интерфейсы, которые должны работать со скалярным значением. Например, вызвав Rune.ToUpperInvariant, как показано в следующем примере, вы получите правильные результаты:
Другие API-интерфейсы Rune
Тип предоставляет аналоги многих API-интерфейсов . Например, приведенные ниже методы отражают статические API-интерфейсы для типа :
- Rune.IsLetter
- Rune.IsWhiteSpace
- Rune.IsLetterOrDigit
- Rune.GetUnicodeCategory
Чтобы получить необработанное скалярное значение из экземпляра , используйте свойство Rune.Value.
Чтобы преобразовать экземпляр обратно в последовательность типов , используйте метод Rune.ToString или Rune.EncodeToUtf16.
Так как любое скалярное значение Юникода может быть представлено одним экземпляром или суррогатной парой, любой экземпляр может быть представлен не более чем двумя экземплярами . Используйте Rune.Utf16SequenceLength, чтобы узнать количество экземпляров , требуемых для представления экземпляра .
Дополнительные сведения о типе .NET см. в справочнике по API для .
Summary
is the core object, a reference to the fixed-length contiguous memory area.
To do almost any operation on , we need a view.
- It can be a :
- , , – for unsigned integers of 8, 16, and 32 bits.
- – for 8-bit integers, “clamps” them on assignment.
- , , – for signed integer numbers (can be negative).
- , – for signed floating-point numbers of 32 and 64 bits.
- Or a – the view that uses methods to specify a format, e.g. .
In most cases we create and operate directly on typed arrays, leaving under cover, as a “common denominator”. We can access it as and make another view if needed.
There are also two additional terms, that are used in descriptions of methods that operate on binary data:
- is an umbrella term for all these kinds of views.
- is an umbrella term for or .
We’ll see these terms in the next chapters. is one of the most common terms, as it means “any kind of binary data” – an or a view over it.
Here’s a cheatsheet:
Комментарии
Чтобы получить экземпляр реализации Decoder класса, приложение должно использовать GetDecoder метод Encoding реализации.
GetCharCountМетод определяет, сколько символов приводит к декодированию последовательности байтов, и GetChars метод выполняет фактическое декодирование. В классе доступно несколько версий обоих методов Decoder . Для получения дополнительной информации см. Encoding.GetChars. DecoderОбъект хранит сведения о состоянии между последовательными вызовами Convert метода или, чтобы он мог правильно декодировать последовательности байтов, охватывающие блоки. DecoderТакже сохраняет конечные байты в конце блоков данных и использует конечные байты в следующей операции декодирования. Поэтому GetDecoder они и GetEncoder полезны для передачи по сети и операций с файлами, так как эти операции часто работают с блоками данных, а не с полным потоком данных.
Примечание
Когда приложение выполняется с потоком данных, необходимо убедиться, что сведения о состоянии сброшены, задав для параметра значение в соответствующем вызове метода. Если возникает исключение или приложение переключает потоки, оно должно вызвать Reset , чтобы очистить внутреннее состояние объекта.
Рекомендации по версиям
DecoderОбъект или Encoder может быть сериализован во время операции преобразования. состояние объекта сохраняется, если он десериализуется в той же версии платформа .NET Framework, но теряется, если он десериализуется в другой версии.
The «Unicode Problem»
Since s are 16-bit-encoded strings, in most browsers calling on a Unicode string will cause a exception if a character exceeds the range of a 8-bit byte (0x00~0xFF). There are two possible methods to solve this problem:
- the first one is to escape the whole string (with UTF-8, see ) and then encode it;
- the second one is to convert the UTF-16 to an UTF-8 array of characters and then encode it.
Here are the two possible methods.
To decode the Base64-encoded value back into a String:
Unibabel implements common conversions using this strategy.
Use a TextEncoder polyfill such as TextEncoding (also includes legacy windows, mac, and ISO encodings), TextEncoderLite, combined with a Buffer and a Base64 implementation such as base64-js.
When a native implementation is not available, the most light-weight solution would be to use TextEncoderLite with base64-js. Use the browser implementation when you can.
The following function implements such a strategy. It assumes base64-js imported as . Note that TextEncoderLite only works with UTF-8.
Задания¶
-
Доработайте прототип чата из прошлого урока таким образом, чтобы он корректно работал с русским языком (используйте методы кодирования и декодирования байтовых строк).
2. Напишите функцию для шифрования файла шифром Цезаря.
Расшифруйте:
key = 2 s = 'Oquv uvctu ctg qdugtxgf vq dg ogodgtu qh dkpctb uvct ubuvgou'
3. Напишите функцию для шифрования файла шифром пар.
Расшифруйте:
d_1 = 109, 122, 106, 115, 100, 99, 105, 120, 110, 98, 121, 118, 107 d_2 = 112, 103, 108, 104, 111, 102, 119, 117, 97, 101, 116, 113, 114 s = 'A hynk wh na nhykdadpwfnj delbfy fdahwhywaz dc n jxpwadxh hmsbkdwo dc mjnhpn sbjo ydzbysbk et wyh dia zknqwyt.'
Методы
Преобразует буфер закодированных байтов в символы в кодировке UTF-16 и сохраняет результат в другом буфере. |
|
Преобразует массив закодированных байтов в символы в кодировке UTF-16 и сохраняет результат в другом массиве символов. |
|
Преобразует диапазон закодированных байтов в символы в кодировке UTF-16 и сохраняет результат в другом буфере диапазона. |
|
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
|
При переопределении в производном классе вычисляет количество символов, полученных при декодировании последовательности байтов, начало которой задается указателем байтов. Параметр указывает, следует ли очистить внутреннее состояние декодера после вычисления. |
|
При переопределении в производном классе вычисляет количество символов, полученных при декодировании последовательности байтов из заданного массива байтов. |
|
При переопределении в производном классе вычисляет количество символов, полученных при декодировании последовательности байтов из заданного массива байтов. Параметр указывает, следует ли очистить внутреннее состояние декодера после вычисления. |
|
При переопределении в производном классе вычисляет число символов, полученных при декодировании последовательности байтов в диапазоне. Параметр указывает, следует ли очистить внутреннее состояние декодера после вычисления. |
|
При переопределении в производном классе декодирует последовательность байтов, начало которой задается указателем байтов, и все байты, расположенные во внутреннем буфере, в набор символов, которые сохраняются, начиная с заданного указателя символов. Параметр указывает, следует ли очистить внутреннее состояние декодера после выполнения преобразования. |
|
При переопределении в производном классе декодирует последовательность байтов из заданного массива байтов и все байты, расположенные во внутреннем буфере, в указанный массив символов. |
|
При переопределении в производном классе декодирует последовательность байтов из заданного массива байтов и все байты, расположенные во внутреннем буфере, в указанный массив символов. Параметр указывает, следует ли очистить внутреннее состояние декодера после выполнения преобразования. |
|
При переопределении в производном классе декодирует последовательность байтов из диапазона и все байты во внутреннем буфере в набор символов, которые сохраняются, начиная с заданного указателя символа. Параметр указывает, следует ли очистить внутреннее состояние декодера после выполнения преобразования. |
|
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
|
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
|
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
|
При переопределении в производном классе возвращает декодер в исходное состояние. |
|
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Кодировка символов в PowerShell
В PowerShell (V6 и более поздних версий) параметр Encoding поддерживает следующие значения:
- : Использует кодировку для набора символов ASCII (7-разрядных).
- : Кодируется в формате UTF-16 с обратным порядком байтов.
- : Использует кодировку по умолчанию для программ MS-DOS и консолей.
- : Кодируется в формате UTF-16 с прямым порядком байтов.
- : Кодируется в формате UTF-7.
- : Кодирует в формате UTF-8 (без спецификации).
- : Кодирует в формате UTF-8 с меткой порядка байтов (BOM)
- : Кодирует в формате UTF-8 без метки порядка байтов (BOM)
- : Кодируется в формате UTF-32.
По умолчанию PowerShell принимает значение для всех выходных данных.
Начиная с PowerShell 6,2, параметр кодировки также разрешает числовые идентификаторы зарегистрированных кодовых страниц (например ,) или строковых имен зарегистрированных кодовых страниц (например ,). Дополнительные сведения см. в документации .NET по кодированию. codepage.
Кодировки¶
Кодировка — это правила перевода одного набора символов в другой. В отношении компьютерных программ речь идёт о правилах кодирования последовательности из нулей и единиц в текст, число или что-либо другое.
Наиболее распространённые кодировки
Обозначение в python |
Название кодировки |
Описание |
---|---|---|
ASCII |
Латинские буквы, цифры и простые символы |
|
windows-1251 |
Кириллическая кодировка (русский и другие языки) |
|
KOI-8 |
Кодировка для русского языка |
|
UTF-8 |
Юникод-кодировка, все языки (длина символа — 8 бит) |
|
UTF-16 |
Юникод-кодировка, все языки (длина символа — 16 бит) |
Unicode — стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира. В настоящее время стандарт является преобладающим в Интернете.
Примеры кодов, имен и соответствующих символов:
Кодирование/декодирование двоичных данных.
Модуль предоставляет функции для кодирования двоичных данных в печатаемые символы ASCII и декодирования таких кодировок обратно в двоичные данные. Он обеспечивает функции кодирования и декодирования для кодировок, указанных в RFC 3548, который определяет алгоритмы , и , а также для де-факто стандартных кодировок и .
Кодировки RFC 3548 подходят для кодирования двоичных данных, чтобы их можно было безопасно отправлять по электронной почте, использовать как части URL-адресов или включать как часть HTTP POST запроса. Алгоритм кодирования не совпадает с алгоритмом программы .
Этот модуль предоставляет два интерфейса. Современный интерфейс поддерживает кодирование байтовоподобных объектов в байты ASCII и декодирование байтообразных объектов или строк, содержащих ASCII в байты. Поддерживаются оба алфавита base-64, определенные в RFC 3548 — это обычный и безопасный для URL и файловой системы.
Устаревший интерфейс (рассматриваться не будет) не поддерживает декодирование из строк, но он предоставляет функции для кодирования и декодирования в и из файловых объектов. Он поддерживает только стандартный алфавит и добавляет новые строки каждые 76 символов в соответствии с RFC 2045.
Примеры использования:
>>> import base64 >>> encoded = base64.b64encode(b'data to be encoded') >>> encoded # b'ZGF0YSB0byBiZSBlbmNvZGVk' >>> data = base64.b64decode(encoded) >>> data # b'data to be encoded'
Кодирование файла в base64
# file-to-base64.py import base64, pprint with open(__file__, 'r', encoding='utf-8') as fp raw = fp.read() byte_string = raw.encode('utf-8') encoded_data = base64.b64encode(byte_string) num_initial = len(byte_string) num_encoded = len(encoded_data) padding = 3 - (num_initial % 3) print(f'{num_initial} байт до кодирования') print(f'{padding} байта заполнения') print(f'{num_encoded} bytes после encoding\n') # Так как строка длинная печатаем ее при помощи pprint pprint.pprint(encoded_data, width=60)
Результат:
$ python3 file-to-base64.py 586 байт до кодирования 2 байта заполнения 784 bytes после encoding (b'IyBmaWxlLXRvLWJhc2U2NC5weQppbXBvcnQgYmFzZTY0LCBwcHJpbnQK' b'CndpdGggb3BlbihfX2ZpbGVfXywgJ3InLCBlbmNvZGluZz0ndXRmLTgn' b'KSBhcyBmcDoKICAgIHJhdyA9IGZwLnJlYWQoKQoKYnl0ZV9zdHJpbmcg' b'PSByYXcuZW5jb2RlKCd1dGYtOCcpCmVuY29kZWRfZGF0YSA9IGJhc2U2' b'NC5iNjRlbmNvZGUoYnl0ZV9zdHJpbmcpCgpudW1faW5pdGlhbCA9IGxl' b'bihieXRlX3N0cmluZykKbnVtX2VuY29kZWQgPSBsZW4oZW5jb2RlZF9k' b'YXRhKQoKcGFkZGluZyA9IDMgLSAobnVtX2luaXRpYWwgJSAzKQoKcHJp' b'bnQoZid7bnVtX2luaXRpYWx9INCx0LDQudGCINC00L4g0LrQvtC00LjR' b'gNC+0LLQsNC90LjRjycpCnByaW50KGYne3BhZGRpbmd9INCx0LDQudGC' b'0LAg0LfQsNC/0L7Qu9C90LXQvdC40Y8nKQpwcmludChmJ3tudW1fZW5j' b'b2RlZH0gYnl0ZXMg0L/QvtGB0LvQtSBlbmNvZGluZ1xuJykKIyDQotCw' b'0Log0LrQsNC6INGB0YLRgNC+0LrQsCDQtNC70LjQvdC90LDRjyDQv9C1' b'0YfQsNGC0LDQtdC8INC10LUg0L/RgNC4INC/0L7QvNC+0YnQuCBwcHJp' b'bnQKcHByaW50LnBwcmludChlbmNvZGVkX2RhdGEsIHdpZHRoPTYwKQ==')
Понимание порядковой шкалы
Порядковая шкала относится к переменной, в которой значение данных хранится из упорядоченного набора. Например, данные используют шкалу Лайкерта для представления окончательного опроса отзывов клиентов, как показано в таблице ниже:
Отзывы клиентов: 5-балльная шкала Лайкерта
Обратная связь | Присвоенный числовой код |
---|---|
Очень плохо | 1 |
Плохо | 2 |
Удовлетворительно | 3 |
Хорошо | 4 |
Очень хорошо | 5 |
В приведенном выше случае мы собрали данные обратной связи с помощью пятибалльной шкалы Лайкерта. Мы присвоили цифровой код 1 – очень плохо, 2 – плохо, 3 – удовлетворительно, 4 – хорошо и 5 – очень хорошо. Мы также можем заметить, что 5 лучше, чем 4, и намного лучше, чем 3. Однако в этом не будет никакого смысла, если мы вычтем очень хорошее из удовлетворительного.
Как мы уже знаем, большинство алгоритмов машинного обучения работают исключительно с числовыми значениями или данными. Это причина кодирования категориальных признаков в представление, совместимое с использованием моделей.
Таким образом, существует несколько хорошо известных подходов к кодированию, в том числе:
- Кодировка метки
- Быстрое кодирование
- Порядковое кодирование.
Однако мы будем рассматривать только кодирование меток в этом руководстве:
Свойства
При переопределении в производном классе получает имя текущей кодировки, которое может использоваться с тегами текста сообщения почтового агента. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает идентификатор кодовой страницы текущего объекта Encoding. (Унаследовано от Encoding) |
|
Возвращает или задает объект DecoderFallback для текущего объекта Encoding. (Унаследовано от Encoding) |
|
Возвращает или задает объект EncoderFallback для текущего объекта Encoding. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает описание текущей кодировки, которое может быть прочитано пользователем. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает имя текущей кодировки, которое может использоваться с тегами заголовка сообщения почтового агента. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает значение, указывающее, может ли текущая кодировка использоваться клиентами браузера для отображения содержимого. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает значение, указывающее, может ли текущая кодировка использоваться клиентами браузера для сохранения содержимого. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает значение, указывающее, может ли текущая кодировка использоваться клиентами электронной почты и новостей для отображения содержимого. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает значение, указывающее, может ли текущая кодировка использоваться клиентами электронной почты и новостей для сохранения содержимого. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает значение, указывающее, является ли текущая кодировка доступной только для чтения. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает значение, указывающее, используются ли в текущей кодировке однобайтовые кодовые точки. (Унаследовано от Encoding) |
|
Возвращает метку порядка байтов Юникода в кодировке UTF-16, если объект настроен для ее предоставления. |
|
При переопределении в производном классе возвращает диапазон, содержащий последовательность байтов, задающую используемую кодировку. (Унаследовано от Encoding) |
|
При переопределении в производном классе получает для текущей кодировки имя, зарегистрированное в IANA (Internet Assigned Numbers Authority). (Унаследовано от Encoding) |
|
При переопределении в производном классе получает кодовую страницу операционной системы Windows, наиболее точно соответствующую текущей кодировке. (Унаследовано от Encoding) |
TypedArray
The common term for all these views (, , etc) is . They share the same set of methods and properities.
Please note, there’s no constructor called , it’s just a common “umbrella” term to represent one of views over : , and so on, the full list will soon follow.
When you see something like , it means any of , , etc.
Typed arrays behave like regular arrays: have indexes and are iterable.
A typed array constructor (be it or , doesn’t matter) behaves differently depending on argument types.
There are 5 variants of arguments:
-
If an argument is supplied, the view is created over it. We used that syntax already.
Optionally we can provide to start from (0 by default) and the (till the end of the buffer by default), then the view will cover only a part of the .
-
If an , or any array-like object is given, it creates a typed array of the same length and copies the content.
We can use it to pre-fill the array with the data:
-
If another is supplied, it does the same: creates a typed array of the same length and copies values. Values are converted to the new type in the process, if needed.
-
For a numeric argument – creates the typed array to contain that many elements. Its byte length will be multiplied by the number of bytes in a single item :
-
Without arguments, creates an zero-length typed array.
We can create a directly, without mentioning . But a view cannot exist without an underlying , so gets created automatically in all these cases except the first one (when provided).
To access the underlying , there are following properties in :
- – references the .
- – the length of the .
So, we can always move from one view to another:
Here’s the list of typed arrays:
- , , – for integer numbers of 8, 16 and 32 bits.
- , , – for signed integer numbers (can be negative).
- , – for signed floating-point numbers of 32 and 64 bits.
No or similar single-valued types
Please note, despite of the names like , there’s no single-value type like , or in JavaScript.
That’s logical, as is not an array of these individual values, but rather a view on .
What if we attempt to write an out-of-bounds value into a typed array? There will be no error. But extra bits are cut-off.
For instance, let’s try to put 256 into . In binary form, 256 is (9 bits), but only provides 8 bits per value, that makes the available range from 0 to 255.
For bigger numbers, only the rightmost (less significant) 8 bits are stored, and the rest is cut off:
So we’ll get zero.
For 257, the binary form is (9 bits), the rightmost 8 get stored, so we’ll have in the array:
In other words, the number modulo 28 is saved.
Here’s the demo:
is special in this aspect, its behavior is different. It saves 255 for any number that is greater than 255, and 0 for any negative number. That behavior is useful for image processing.
Заключение
Unicode является стандартом де-факто для представления текста на любых языках в современном программном обеспечении. Unicode-текст можно кодировать в разнообразных форматах: два наиболее важных из них — UTF-8 и UTF-16. В C++-коде для Windows часто требуется преобразовывать строки между кодировками UTF-8 и UTF-16, так как Win32-функции с поддержкой Unicode используют UTF-16 в качестве “родной” Unicode-кодировки. Текст в кодировке UTF-8 удобно хранить в экземплярах STL-класса std::string, тогда как std::wstring хорошо подходит для хранения текста в кодировке UTF-16 в C++-коде для Windows, ориентированном на компилятор Visual C++.
Win32-функции MultiByteToWideChar и WideCharToMultiByte позволяют выполнять преобразования Unicode-текста между кодировками UTF-8 и UTF-16. Я подробно описал шаблон использования функции MultiByteToWideChar, обернув ее в повторно используемую вспомогательную функцию на современном C++ для выполнения преобразований из UTF-8 в UTF-16. Обратное преобразование следует очень похожему шаблону, и повторно используемый C++-код, реализующий его, доступен в пакете кода, сопутствующем этой статье.
Джованни Диканио (Giovanni Dicanio) — программист со специализацией в области C++ и Windows, автор Pluralsight и обладатель звания Visual C++ MVP. Помимо программирования и создания учебных курсов, с удовольствием помогает другим на форумах и в сообществах, преданных C++. С ним можно связаться по адресу [email protected]. Также ведет блог на blogs.msmvps.com/gdicanio.
Выражаю благодарность за рецензирование статьи экспертам Дэвиду Крейви (David Cravey) и Марку Грегуа (Marc Gregoire).