Encoding_RS Реализация (не Javascript Parts of) стандарта кодирования, написанного в ржавчине.
Стандарт кодирования определяет веб-совместимый набор кодировки символов, что означает, что этот ящик может использоваться для декодирования веб-контента. Encoding_RS используется в гекконе, начиная с Firefox 56. Из-за заметного совпадения между устаревшими кодировками в Интернете и устаревшими кодировками, используемыми в Windows, этот ящик может использоваться и для не связанных с WEB ситуаций; Смотрите ниже ссылки на соседние ящики.
Кроме того, модуль mem обеспечивает различные операции для работы с текстом в RAM (в отличие от данных, которые поступают или переходят на границу IO). mem модуль представляет собой модуль вместо отдельного ящика из -за эффективности внутренней реализации.
В связи с вариантом использования геккона, Encoding_RS поддерживает декодирование и кодировку от UTF-16 в дополнение к тому, чтобы поддержать обычный случай использования ржавчины и кодировки от UTF-8. Кроме того, API был разработан, чтобы быть FFI-дружественным, чтобы приспособить сторону C ++ Gecko.
В частности, Encoding_RS делает следующее:
u16 / char16_t ).u16 / char16_t ) в последовательность байтов в кодирующем стандартно определяемом символе, как если бы одинокие суррогаты были заменены заменяющим символом перед выполнением экодирования. (Gecko's UTF-16 потенциально недействителен.)document.characterSet . Кроме того, encoding_rs::mem делает следующее:
std::io Примечательно, что приведенный выше список функций не включает в себя возможность обернуть std::io::Read , декодировать его в UTF-8 и представить результат через std::io::Read . Ящик encoding_rs_io предоставляет эту возможность.
no_std среда Ящик работает в среде no_std . По умолчанию функция alloc , которая предполагает, что присутствует распределитель. Для среды без распределения функции по умолчанию (т.е. alloc ) могут быть отключены. Это делает часть API, которая возвращает Vec / String / Cow недоступной.
Для декодирования кодировки символов, которые встречаются в электронной почте, используйте ящик charset вместо использования этого напрямую. (Он завершает этот ящик и добавляет декодирование UTF-7.)
Для отображений с идентификаторами кода Windows и из кодового кода используйте ящик codepage .
Этот ящик не поддерживает однобайтные кодировки DOS, которые не требуются веб-платформой, но ящик oem_cp делает.
Нормализация текста в форму нормализации Unicode C Перед кодированием текста в устаревшее кодирование сводит к минимуму неподвижные символы. Текст может быть нормализован до формы нормализации Unicode C, используя ящик icu_normalizer .
Исключением является Windows-1258, которая после нормализации до формы нормализации Unicode C, требует разложения тональных знаков, чтобы минимизировать непоколебимые символы. Вьетнамские тональные знаки могут быть разложены с использованием ящика detone .
TL; DR: (Apache-2.0 OR MIT) AND BSD-3-Clause для комбинации кода и данных.
Пожалуйста, смотрите файл с именем Copyright.
Код без тестирования, который не генерируется из данных WhatWG в этом ящике, находится под Apache-2.0 или MIT. Тестовый код находится под CC0.
Этот ящик содержит код/данные, сгенерированные из данных, приплеванных WhatWG. WhatWG Upstream изменила свою лицензию на части спецификаций, включенных в исходный код от CC0 на BSD-3-оценить между первоначальным выпуском этого ящика и нынешней версией этого ящика. Легенды лицензирования в исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном исходном стиле были обновлены для частей сгенерированного кода, которые изменились с момента изменения лицензии вверх по течению.
Сгенерированная документация API доступна онлайн.
Существует длинная запись о дизайне и внутренних органах ящика.
Слой FFI для Encoding_RS доступен в виде отдельного ящика. Ящик поставляется с демо -оболочкой C ++ с использованием стандартной библиотеки C ++ и типов GSL.
Привязки для модуля mem находятся в ящике Encoding_C_MEM.
Для контекста геккона есть обертка C ++, использующая типы MFBT/XPCOM.
Есть запись о обертках C ++.
В настоящее время эти дополнительные грузовые функции:
simd-accel Включает ускорение SIMD с использованием ночной зависимой от ночной функции стандартной библиотеки portable_simd .
Это функция Oct-In, потому что позволяет этой функции выходить из гарантий Rust от будущих компиляторов, компилирующих старый код (он же «История стабильности»).
В настоящее время это не было проверено как улучшение, за исключением этих целей, и ожидается, что функция simd-accel сломает строительство на других целях:
Если вы используете ночную ржавчину, вы используете цели, первый компонент которого является одним из вышеперечисленных, и вы готовы пересмотреть свою конфигурацию при обновлении ржавчины , вы должны включить эту функцию. В противном случае, пожалуйста, не включайте эту функцию.
Используется Firefox.
serde Обеспечивает поддержку сериализации и пустыни &'static Encoding -поля структуры с использованием Serde.
Не используется Firefox.
fast-legacy-encodeОпция All-All для включения самых быстрых параметров кодирования Legacy. Не влияет на скорость декодирования или скорость кодирования UTF-8.
В настоящее время эта опция эквивалентна включению следующих параметров:
fast-hangul-encodefast-hanja-encodefast-kanji-encodefast-gb-hanzi-encodefast-big5-hanzi-encodeДобавляет 176 КБ к бинарному размеру.
Не используется Firefox.
fast-hangul-encodeИзменения, кодирующие предварительные слоги Hangul, в EUC-KR из бинарного поиска по декодированным таблицам, чтобы поиск по индексу, создавая кодирование корейского простого текста примерно в 4 раза быстрее, чем без этой опции.
Добавляет 20 КБ к бинарному размеру.
Не влияет на скорость декодирования.
Не используется Firefox.
fast-hanja-encodeИзменения, кодирующие Hanja, в EUC-KR из линейного поиска по оптимизированной декодированной таблице для поиска по индексу. Поскольку Ханджа практически отсутствует в современном корейском тексте, этот вариант не влияет на производительность в общем случае и в основном имеет смысл, если вы хотите, чтобы ваше приложение устойчивое отрицание агаистического отказа в обслуживании кто-то преднамеренно кормил бы ему много Ханджи, чтобы кодировать в EUC-KR.
Добавляет 40 КБ к бинарному размеру.
Не влияет на скорость декодирования.
Не используется Firefox.
fast-kanji-encode Изменения, кодирующие кандзи в shift_jis, euc-jp и iso-2022-jp из линейного поиска по оптимизированным декодированным таблицам, чтобы поиск по индексу, делая японский текст, кодируя в устаревших кодированиях в 30-50 раз, чем без этой опции (примерно в 2 раза быстрее, чем с less-slow-kanji-encode ).
Имеет приоритет над less-slow-kanji-encode .
Добавляет 36 КБ к двоичному размеру (24 КБ по сравнению с less-slow-kanji-encode ).
Не влияет на скорость декодирования.
Не используется Firefox.
less-slow-kanji-encodeДелает JIS X 0208 Уровень 1 Кандзи (наиболее распространенный кандзи в shift_jis, euc-jp и iso-2022-jp) кодирует менее медленный (двоичный поиск вместо линейного поиска), что делает японский текст в простом тексту в устаревшие кодирования в 14-23 раза быстрее, чем без этой опции.
Добавляет 12 КБ к бинарному размеру.
Не влияет на скорость декодирования.
Не используется Firefox.
fast-gb-hanzi-encode Изменения, кодирующие Hanzi в единых идеографиях CJK, блокируются в GBK и GB18030 из линейного поиска по части, оптимизированные декодированные таблицы, за которыми следуют бинарный поиск по другой части нептимизированных декодированных таблиц, чтобы найти индекс, упрощенный китайский текстовый текст в кодируемые кодирования 100 до 110 времени, в течение этого, примерно на 2-й размер. less-slow-gb-hanzi-encode ).
Принимает приоритет над less-slow-gb-hanzi-encode .
Добавляет 36 КБ к двоичному размеру (24 КБ по сравнению с less-slow-gb-hanzi-encode ).
Не влияет на скорость декодирования.
Не используется Firefox.
less-slow-gb-hanzi-encodeДелает GB2312 Уровень 1 Hanzi (наиболее распространенный Hanzi в GB18030 и GBK) кодирует менее медленный (двоичный поиск вместо линейного поиска), что делает упрощенный китайский текстовый текст кодирующим в устаревшие кодирования примерно в 40 раз быстрее, чем без этой опции.
Добавляет 12 КБ к бинарному размеру.
Не влияет на скорость декодирования.
Не используется Firefox.
fast-big5-hanzi-encode Изменения, кодирующие Hanzi в унифицированных идеографах CJK, блокируются в BIG5 из линейного поиска над частью, оптимизированными декодированием таблиц, чтобы поиск по индексу, делая традиционный китайский текстовый текст для BIG5 до 125 раз, чем без этой опции (примерно в 3 раза быстрее, чем с less-slow-big5-hanzi-encode ).
Принимает приоритет над less-slow-big5-hanzi-encode .
Добавляет 40 КБ к двоичному размеру (20 КБ по сравнению с less-slow-big5-hanzi-encode ).
Не влияет на скорость декодирования.
Не используется Firefox.
less-slow-big5-hanzi-encodeMake Big5 Level 1 Hanzi (наиболее распространенный Hanzi в Big5) кодирует менее медленный (двоичный поиск вместо линейного поиска), создавая традиционные китайские простого текста в Big5 примерно в 36 раз быстрее, чем без этой опции.
Добавляет 20 КБ к бинарному размеру.
Не влияет на скорость декодирования.
Не используется Firefox.
Для декодирования в UTF-16 цель состоит в том, чтобы выступить, по крайней мере, так же, как и старый Gecko's Old UConv. Для декодирования в UTF-8 цель состоит в том, чтобы выполнить по крайней мере, а также кодирование ржавчины. Эти цели были достигнуты.
Кодирование в UTF-8 должно быть быстро. (UTF-8 в UTF-8 Кодирование должно быть эквивалентно memcpy , а UTF-16-UTF-8, должен быть быстрым.)
Скорость-это нецелевая кодировка на устаревшие кодировки. По умолчанию кодирование в устаревшие кодировки не должны быть оптимизированы для скорости за счет размера кода, если подача формы и анализ URL в гекконе не становятся заметно слишком медленными в реальном использовании.
В интересах двоичного размера, по умолчанию, Encoding_RS не имеет специфичных для кодирования таблиц данных, превышающих 32 бита данных, специфичных для экода, для каждой одно-байтовой кодировки. Следовательно, энкодеры ищут таблицы данных, оптимизированные декодированием. Это линейный поиск в большинстве случаев. В результате, по умолчанию, кодирование в устаревшие кодировки варьируются от медленных до чрезвычайно медленных по сравнению с другими библиотеками. Тем не менее, с реалистичными рабочими нагрузками, это казалось достаточно быстро, чтобы не быть пользователем видно медленной на Raspberry Pi 3 (который стоял для телефона для тестирования) в вариантах использования энкодера, подвергшегося воздействию Интернета.
См. Функции груза выше для опционального создания устаревшего кодирования CJK.
Структура для измерения производительности доступна отдельно.
Это цель - поддержать последнюю стабильную ржавчину, последнюю ночную ржавчину и версию Rust, которая используется для Firefox Nightly.
В настоящее время нет никакой твердой приверженности поддержать версию, старше того, что требуется Firefox, и нет никаких обязательств рассматривать изменения MSRV как разбитые, потому что этот ящик зависит от cfg-if , который, по-видимому, не рассматривает изменения MSRV как ломаные, поэтому для этого ящика будет бесполезно рассматривать MSRV-изменения.
По состоянию на 2024-11-01 MSRV, по-видимому, представляет собой ржавчину 1.40.0 для использования ящика и 1.42.0 для прохождения DOC-тестов без ошибок в отношении глобального распределения. С функцией simd-accel MSRV еще выше.
Слой совместимости, который реализует API-кодирование ржавчины поверх кодирования_Р, предоставляется в виде отдельного ящика (не может быть загружен в Crates.io). Слой совместимости был первоначально написан с предположением, что Firefox ему понадобится, но в настоящее время он не используется в Firefox.
Чтобы восстановить сгенерированный код:
https://github.com/hsivonen/encoding_c рядом с каталогом encoding_rs .https://github.com/hsivonen/codepage рядом с каталогом encoding_rs .https://github.com/whatwg/encoding рядом с каталогом encoding_rs .1d519bf8e5555cef64cf3a712485f41cd1a6a990 encoding репо. (Примечание: f381389 был пересмотром encoding , используемого до изменения лицензии на encoding .)encoding_rs в качестве рабочего каталога запустите python generate-encoding-data.py Data.py. usize вместо u8 за раз). alloc (с меньшей поверхностью API). std::simdunsafe доступ к срезам большими типами, чем u8 / u16 в align_to . portable_simd стандартной библиотеки вместо ящика packed_simd . Только влияет только на опциональную ночную функцию simd-accel .unsafe .rust-version в Cargo.toml .packed_simd вместо packed_simd_2 снова теперь, когда обновления вернулись под именем packed_simd . Только влияет только на опциональную ночную функцию simd-accel .build.rs . (Это удаление должно разрешить ложные срабатывания, сообщаемые некоторыми антивирусными продуктами. Это может сломать некоторые конфигурации сборки, которые отказались от гарантий Rust от будущего разрыва сборки.)no_std .no_std (с alloc ).simd-accel .packed_simd от packed_simd_2 .cfg-if до 1.0.cfg-if обновлено до издания 2018 без перерыва.Decoder::latin1_byte_compatible_up_to nate None в большем случае, чтобы сделать метод действительно полезным. Хотя это можно утверждать, что это нарушающее изменение из -за исправления ошибки, изменяя семантику, он не нарушает вызывающих абонентов, которые в любом случае не должны были обращаться с None .convert_str_to_utf16 .mem::convert_utf8_to_utf16_without_replacement .mem::utf8_latin1_up_to и mem::str_latin1_up_to .Decoder::latin1_byte_compatible_up_to .bincode (Dev Depertion) до 1.0.simd на packed_simd .simd-accel (выпуск только для чтения).clippy:: Префикс из имен Clippy Lint.static при определении другой static ).is_single_byte() при Encoding .mem::decode_latin1() и mem::encode_latin1_lossy() .--features simd-accel работает со стабильным компилятором, чтобы упростить систему сборки Firefox.is_foo_bidi() не обрабатывать u+feff (Zero ширина без разрывов, известная как байт-байт.is_foo_bidi() true , если ввод содержит формы ивритских презентаций (которые имеют право на летя, но не в блоке с правом на лете).convert_utf16_to_latin1_lossy .mem MODULE утверждают, что вход в диапазоне U+0000 ... U+00FF (включительно).mem обеспечивают конверсию от Latin1 и UTF-16 в UTF-8, которые могут иметь дело с недостаточным выходным пространством. Идея состоит в том, чтобы использовать их сначала с распределением, окруженным до размера ведра Джемаллока, и выполнить самое наихудшее распределение, только если округление Джемаллока было недостаточным, как первое предположение.simd-accel CORRUPTION памяти, введенная в версии 0.8.1 в конверсии между UTF-16 и Latin1 в модуле mem .#[inline(never)] аннотация, которая не была предназначена для выпуска.mem для повышения производительности при преобразовании длинных буферов.mem .mem .replacement меткой замены кодирования. (Специальное изменение.)Encoding::for_name() . ( Encoding::for_label(foo).unwrap() теперь достаточно близко после изменения вышеуказанной метки.)parallel-utf8 .&'static Encoding .Encoder::has_pending_state() Public.simd до 0.2.0.7F правильно в ISO-2022-JP.Hash для Encoding .InputEmpty по сравнению с OutputFull при кодировании с заменой, а выходной буфер передается слишком коротким, или оставшееся пространство в выходном буфере слишком мал после замены.PartialEq и Eq для типов CoderResult , DecoderResult и EncoderResult .Encoder::encode_from_utf16 . (Из -за надзора, ему не хватало исправления, что Encoder::encode_from_utf8 уже имел.)#[must_use] .parallel-utf8 ).simd-accel .Encoding от const в static , чтобы сделать референты уникальными для ящиков, которые используют рефераты.FOO_INIT , не подписанные на Encoding , чтобы позволить иностранным ящикам инициализации static массивов со ссылками на Encoding экземпляры, даже при ограничениях Руста, которые запрещают инициализацию &'static Encoding статиков -статических &'static Encoding statics .const работать, так что использование кросс-класса сохраняет уникальные референты.Cow из несущественных методов Rust только для кодирования и декодирования.Encoding::for_bom() Возвращает длину тела.simd-accel . (Требуется ночная ржавчина.)Encoder.encode_from_utf8_to_vec_without_replacement() . Добавить Encoding.is_ascii_compatible() .
Добавьте Encoding::for_bom() .
Сделайте == для сравнения имени Encoding вместо сравнения указателей, потому что использование констант кодирования в разных ящиках приводит к разным адресам, а постоянная не может быть превращена в статику, не разбивая другие вещи.
Первоначальный выпуск.