encoding_rs Rust로 작성된 인코딩 표준의 (JavaScript 부분) 구현.
인코딩 표준은 웹 호환 문자 인코딩 세트를 정의합니다. 즉,이 상자를 사용하여 웹 컨텐츠를 디코딩 할 수 있습니다. Encoding_rs는 Firefox 56으로 시작하여 Gecko에서 사용됩니다. 웹의 레거시 인코딩과 Windows에서 사용되는 레거시 인코딩 사이의 눈에 띄는 중첩으로 인해이 상자는 비 WEB 관련 상황에도 사용될 수 있습니다. 인접한 상자에 대한 링크는 아래를 참조하십시오.
또한, mem 모듈은 내내 텍스트를 다루기위한 다양한 작업을 제공합니다 (IO 경계에서 나오는 데이터와 반대로). mem 모듈은 내부 구현 세부 효율로 인해 별도의 상자 대신 모듈입니다.
Gecko 사용 사례로 인해 Encoding_RS는 UTF-8에서 디코딩 및 인코딩의 일반적인 녹이 사례를 지원하는 것 외에도 UTF-16의 디코딩 및 인코딩을 지원합니다. 또한 API는 도마뱀의 C ++ 측을 수용하기 위해 FFI 친화적으로 설계되었습니다.
구체적으로, encoding_rs는 다음을 수행합니다.
u16 / char16_t )으로 인코딩하는 바이트 스트림을 디코딩합니다.char16_t 정렬 된 원시 이용자 인 람 (Native-Endian In-Ram u16 -16)의 스트림을 인코딩을 인코딩 표준 정의 된 문자 인코딩에서 인코딩 된 표준 정의 문자 인코딩에서 바이트 시퀀스로 인코딩합니다. (Gecko의 UTF-16은 잠재적으로 유효하지 않습니다.)document.characterSet 에 맵핑하십시오. 또한 encoding_rs::mem 다음을 수행합니다.
std::io 와의 통합 특히 위의 기능 목록에는 std::io::Read 하고 UTF-8으로 디코딩하고 std::io::Read 통해 결과를 제시하는 기능이 포함되어 있지 않습니다. encoding_rs_io 상자는 그 기능을 제공합니다.
no_std 환경 상자는 no_std 환경에서 작동합니다. 기본적으로 Allocator가 존재한다고 가정하는 alloc 기능이 활성화되어 있다고 가정합니다. 알코올이없는 환경의 경우 기본 기능 (예 : alloc )을 꺼질 수 있습니다. 이로 인해 Vec / String / Cow 반환 할 수없는 API의 일부를 사용할 수 없습니다.
이메일로 발생하는 캐릭터 인코딩을 해독하려면 직접 사용하는 대신 charset 상자를 사용하십시오. (이 상자를 감싸고 UTF-7 디코딩을 추가합니다.)
Windows 코드 페이지 식별자와의 매핑의 경우 codepage Crate를 사용하십시오.
이 상자는 웹 플랫폼에서 필요하지 않은 단일 바이트 DOS 인코딩을 지원하지 않지만 oem_cp 상자는 그렇습니다.
텍스트를 유니 코드 정규화 형태 C로 정규화하면 텍스트를 레거시 인코딩으로 인코딩하기 전에 appable 문자를 최소화합니다. 텍스트는 icu_normalizer 상자를 사용하여 유니 코드 정규화 형태 C로 정규화 될 수 있습니다.
예외는 Windows-1258이며, 유니 코드 정규화 형태 C로 정규화 한 후 C는 호출 가능한 문자를 최소화하기 위해 톤 마크를 분해해야합니다. 베트남 톤 마크는 detone Crate를 사용하여 분해 될 수 있습니다.
TL; DR : (Apache-2.0 OR MIT) AND BSD-3-Clause .
Copyright라는 파일을 참조하십시오.
이 상자의 Whatwg 데이터에서 생성되지 않은 비 테스트 코드는 Apache-2.0 또는 MIT에 있습니다. 테스트 코드는 CC0 아래에 있습니다.
이 상자에는 Whatwg-insupplied 데이터에서 생성 된 코드/데이터가 포함되어 있습니다. Whatwg 업스트림은이 상자의 초기 릴리스 와이 상자의 현재 버전 사이에서 CC0에서 BSD-3 클레임으로 소스 코드에 통합 된 사양의 일부에 대한 라이센스를 변경했습니다. 상류 라이센스 변경 이후 변경된 생성 된 코드의 일부에 대해 소스 내 라이센스 범례가 업데이트되었습니다.
생성 된 API 문서는 온라인으로 제공됩니다.
상자의 디자인과 내부에 대한 긴 형식의 글이 있습니다.
encoding_rs에 대한 FFI 층은 별도의 상자로 제공됩니다. 상자에는 C ++ 표준 라이브러리 및 GSL 유형을 사용하여 데모 C ++ 래퍼가 함께 제공됩니다.
mem 모듈의 바인딩은 encoding_c_mem 크레이트에 있습니다.
Gecko 컨텍스트의 경우 MFBT/XPCOM 유형을 사용하는 C ++ 래퍼가 있습니다.
C ++ 포장지에 대한 글이 있습니다.
현재 이러한 선택적화물 기능이 있습니다.
simd-accel 야간 의존적 인 portable_simd 표준 라이브러리 기능을 사용하여 SIMD 가속도를 활성화합니다.
이 기능을 활성화하면이 기능을 활성화하면 이전 코드를 컴파일하는 미래 컴파일러에 대한 Rust의 보장을 선택하지 않기 때문입니다 (일명 "Stability Story").
현재 이는 이러한 대상을 제외하고는 개선으로 테스트되지 않았으며 simd-accel 기능을 가능하게하는 것은 다른 대상의 빌드를 중단 할 것으로 예상됩니다.
Nightly Rust를 사용하는 경우 첫 번째 구성 요소가 위의 구성 요소 중 하나 인 대상을 사용하고 Rust를 업데이트 할 때 구성을 수정해야 할 준비가되어 있습니다.이 기능을 활성화해야합니다. 그렇지 않으면이 기능을 활성화 하지 마십시오 .
Firefox에서 사용합니다.
serde SERDE를 사용하여 직렬화 및 사제화 &'static Encoding -유형 구조장 필드를 지원할 수 있습니다.
Firefox에서 사용하지 않습니다.
fast-legacy-encode가장 빠른 레거시 인코딩 옵션을 활성화하기위한 캐치 옵션. 디코드 속도 또는 UTF-8 인코딩 속도에는 영향을 미치지 않습니다.
현재이 옵션은 다음 옵션을 활성화하는 것과 같습니다.
fast-hangul-encodefast-hanja-encodefast-kanji-encodefast-gb-hanzi-encodefast-big5-hanzi-encode이진 크기에 176 kb를 추가합니다.
Firefox에서 사용하지 않습니다.
fast-hangul-encode한국의 일반 텍스트 가이 옵션없이 약 4 배나 빠르게 인코딩하여 디코드-최적화 된 테이블을 통해 이진 검색에서 바이너리 검색에서 EUC-KR로 미리 복합 한 Hangul 음절을 EUC-KR로 인코딩합니다.
이진 크기에 20 kb를 추가합니다.
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
fast-hanja-encodeDecode-Optomized 테이블을 통해 선형 검색에서 인덱스를 조회하기 위해 Hanja를 EUC-KR로 인코딩하는 것을 변경합니다. 한자는 현대 한국 텍스트에 실제로 없기 때문에이 옵션은 공동 사례의 성능에 영향을 미치지 않으며 주로 euc-kr로 인코딩하기 위해 많은 한자에게 공급하는 사람에 의해 응용 프로그램 탄력성 농업 학자 거부를 원한다면 주로 의미가 있습니다.
이진 크기에 40 kb를 추가합니다.
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
fast-kanji-encode Kanji를 Shift_jis, EUC-JP 및 ISO-2022-JP로 인코딩하는 것은 디코드-최적화 된 테이블 위의 선형 검색에서 일본어 일반 텍스트 인코딩을이 옵션없이 레거시 인코딩으로 30 ~ 50 배 빠르게 만들어 ( less-slow-kanji-encode 보다 약 2 배 빠른) 인덱스를 사용하여 조회하여 조회합니다.
less-slow-kanji-encode 보다 우선합니다.
이진 크기에 36 kb를 추가합니다 ( less-slow-kanji-encode 에 비해 24kb).
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
less-slow-kanji-encodeJIS X 0208 Level 1 Kanji (Shift_jis, EUC-JP 및 ISO-2022-JP에서 가장 일반적인 Kanji)는 일본어 일반 텍스트 인코딩을이 옵션없이 14 ~ 23 배 빠른 레거시 인코딩으로 만드는 느린 느린 (선형 검색 대신 이진 검색) 인코딩합니다.
이진 크기에 12kb를 추가합니다.
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
fast-gb-hanzi-encode CJK Unified Ideographs에서 Hanzi를 인코딩하는 변경 사항은 Decode-Optomized 테이블의 일부에 대한 선형 검색에서 선형 검색에서 GBK 및 GB18030으로 차단합니다. Decode-Optomized 테이블의 다른 부분을 통해 이진 검색을 통해 Decode-Optomized 테이블의 다른 부분을 검색하여 인덱스를 통해 단순화 된 중국어 텍스트 인코딩을 통해 100 ~ 110 배의 간단한 유산 인코딩을 통해 (약 2.5 번 정도). less-slow-gb-hanzi-encode ).
less-slow-gb-hanzi-encode 보다 우선합니다.
이진 크기에 36 kb를 추가합니다 ( less-slow-gb-hanzi-encode 에 비해 24kb).
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
less-slow-gb-hanzi-encodeGB2312 Level 1 Hanzi (GB18030 및 GBK에서 가장 일반적인 Hanzi)를 인코딩하여 덜 느리게 (선형 검색 대신 바이너리 검색) 단순화 된 중국어 일반 텍스트 인코딩 이이 옵션 없이도 약 40 배 빠르게 사용됩니다.
이진 크기에 12kb를 추가합니다.
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
fast-big5-hanzi-encode CJK Unified Ideograph는 선형 검색에서 BIG5로 차단하는 변경 사항이 옵션없이 전통적인 중국 일반 텍스트를 BIG5 105 ~ 125 배로 인덱싱하여 Decode-Opmentized 테이블을 선형 검색에서 BIG5로 차단합니다 less-slow-big5-hanzi-encode 에서는 약 3 배나 빠릅니다).
less-slow-big5-hanzi-encode 보다 우선합니다.
이진 크기에 40 kb를 추가합니다 ( less-slow-big5-hanzi-encode 에 비해 20kb).
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
less-slow-big5-hanzi-encodeBIG5 레벨 1 Hanzi (BIG5에서 가장 일반적인 Hanzi)는 덜 느리게 인코딩 (선형 검색 대신 이진 검색)이 옵션없이 전통적인 중국어 일반 텍스트를 BIG5로 인코딩합니다.
이진 크기에 20 kb를 추가합니다.
디코드 속도에는 영향을 미치지 않습니다 .
Firefox에서 사용하지 않습니다.
UTF-16으로 디코딩하기 위해 목표는 최소한 Gecko의 오래된 UCONV를 수행하는 것입니다. UTF-8로 디코딩하기 위해서는 목표는 적어도 녹음뿐만 아니라 수행하는 것입니다. 이러한 목표가 달성되었습니다.
UTF-8로 인코딩하는 것은 빠르야합니다. (UTF-8에서 UTF-8 엔코드는 memcpy 와 동일하고 UTF-16에서 UTF-8까지는 빠르야합니다.)
레거시 인코딩으로 인코딩 할 때 속도는 시간이 측정됩니다. 기본적으로, 레거시 인코딩으로 인코딩하는 것은 양식 제출 및 Gecko의 URL 구문 분석이 실제 사용에서 눈에 띄게 느리게되지 않는 한 코드 크기를 희생하여 속도에 맞게 최적화되어서는 안됩니다.
이진 크기를 위해, 기본적으로, Encoding_RS는 각 단일 바이트 인코딩에 대해 32 비트의 인코딩 별 데이터 테이블을 초과하지 않습니다. 따라서 인코더는 디코드 최적화 된 데이터 테이블을 검색합니다. 이것은 대부분의 경우 선형 검색입니다. 결과적으로, 기본적으로 레거시 인코딩으로 인코딩은 다른 라이브러리에 비해 느리게 느리게 느리게 다릅니다. 그럼에도 불구하고 현실적인 작업 부하로 인해 웹 노출 인코더 사용 사례에서 Raspberry Pi 3 (테스트를 위해 전화를 위해 서면)에서 사용자가 눈에 띄게 느려지지 않을 정도로 빠르게 보였습니다.
선택적으로 CJK 레거시를 빠르게 인코딩하도록하려면 위의화물 기능을 참조하십시오.
성능 측정을위한 프레임 워크는 별도로 사용할 수 있습니다.
최신 안정적인 녹, 최신 야간 녹 및 Firefox Nightly에 사용되는 Rust 버전을 지원하는 것이 목표입니다.
현재 Firefox가 요구하는 것보다 오래된 버전을 지원하겠다는 확고한 약속은 없으며 MSRV 변경을 Semver-Breaking으로 처리하겠다는 약속은 없습니다.이 상자는 cfg-if 에 의존하기 때문에 MSRV 변경을 Semver-Breaking으로 치료하는 것처럼 보이지 않기 때문에이 Crate가 Semver-Breaking으로 치료하는 것은 쓸모가 없습니다.
2024-11-01 년 현재, MSRV는 상자를 사용하는 경우 1.40.0, DOC 테스트의 경우 1.42.0 인 것으로 보입니다. simd-accel 기능을 사용하면 MSRV가 훨씬 높습니다.
Encoding_RS 위에 녹음 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 실행하십시오. u8 대신 usize 처리). alloc 없이 작동하는 빌드 모드를 제공합니다 (API 표면이 적음). std::simd 로 마이그레이션합니다u8 / u16 보다 더 큰 유형별로 unsafe 슬라이스 액세스를 align_to 로 마이그레이션하십시오. packed_simd 상자 대신 표준 라이브러리의 portable_simd 야간 기능을 사용하십시오. simd-accel 옵션 야간 기능에만 영향을 미칩니다.unsafe 경미한 코드 개선.Cargo.toml 에 rust-version 추가했습니다.packed_simd_2 대신 packed_simd 사용하십시오. 이제 업데이트가 packed_simd 이름으로 다시 돌아옵니다. simd-accel 옵션 야간 기능에만 영향을 미칩니다.build.rs 제거했습니다. (이 제거는 일부 안티 바이러스 제품에 의해보고 된 잘못된 양성을 해결해야합니다. 이는 향후 빌드 파손에 대한 Rust의 보장에서 벗어난 일부 빌드 구성을 중단 할 수 있습니다.)no_std 지원의 일부로 도입 된 SERDE 지원 오류를 수정하십시오.no_std 환경 ( alloc )에서 작동하게합니다.simd-accel 기능을 깨뜨린 Edition 2018 Migration의 감독 수정.packed_simd 종속성을 packed_simd_2 로 업데이트하십시오.cfg-if 종속성을 1.0으로 업데이트하십시오.cfg-if 이전에 SEMVER 브레이크없이 Edition 2018에 업데이트 된 이래로 Edition 2018에 대한 업데이트.Decoder::latin1_byte_compatible_up_to make make make more deccess를 실제로 유용하게 만들기 위해 더 많은 경우에 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 Dependency) 버전 요구 사항을 1.0으로 업데이트하십시오.simd 상자에서 packed_simd 로 전환하십시오.simd-accel (readME 전용 릴리스)에 대한 설명서를 조정하십시오.clippy:: Prefix를 Clippy Lint 이름에서 제거했습니다.static 정의 할 때 static 의 내부를 참조 할 수있는 기능).Encoding 에서 추가 된 메소드 is_single_byte() .mem::decode_latin1() 및 mem::encode_latin1_lossy() 추가했습니다.--features simd-accel 은 안정적인 채널 컴파일러와 함께 Firefox 빌드 시스템을 단순화합니다.is_foo_bidi() 가 U+Feff (제로 폭이없는 공간)를 오른쪽에서 왼쪽으로 취급하지 않습니다.true is_foo_bidi() 기능을보고합니다.convert_utf16_to_latin1_lossy 에서 0.8.5 버전으로 추가 된 디버그 어설 션을 일시적으로 제거했습니다.mem 모듈의 LATIN1로의 손실 변환은 입력이 U+0000 범위에 있다고 주장합니다.mem 모듈에서는 LATIN1 및 UTF-16에서 UTF-8으로의 전환이 불충분 한 출력 공간을 처리 할 수 있습니다. 아이디어는 Jemalloc 버킷 크기로 반올림 된 할당으로 먼저 사용하고 Jemalloc 반올림이 첫 번째 추측으로 불충분 한 경우에만 최악의 할당을 수행하는 것입니다.mem 모듈에서 UTF-16과 LATIN1 사이의 변환에서 버전 0.8.1로 도입 된 SSE2- 특이 적 simd-accel 특이 적 메모리 손상을 수정하십시오.#[inline(never)] 주석을 제거했습니다.mem 모듈에서 UTF-16과 LATIN1 사이의 SSE2 변환에 대한 조정 된 루프 Unrolling 및 메모리 정렬은 긴 버퍼를 변환 할 때 성능을 향상시킵니다.mem 모듈을 추가하십시오.mem 모듈 외부의 성능에 영향을 줄 수있는 REFACTOR SIMD 코드.replacement 대체 인코딩의 레이블로 만드십시오. (사양 변경.)Encoding::for_name() . ( Encoding::for_label(foo).unwrap() 위의 레이블 변경 후에 충분히 가까워졌습니다.)parallel-utf8 화물 기능을 제거하십시오.&'static Encoding 대한 옵션 Serde 지원을 추가하십시오.Encoder::has_pending_state() public을 만듭니다.simd 상자 의존성을 0.2.0으로 업데이트하십시오.7F 올바르게 디코딩하십시오.Encoding 위한 Hash 구현하십시오.OutputFull 보다 InputEmpty 정확한 우선 순위를 부여하십시오.CoderResult , DecoderResult 및 EncoderResult 유형에 대해 PartialEq 및 Eq 도출합니다.Encoder::encode_from_utf16 의 잘못된 지수로 구리 슬라이싱에서 공황을 수정하십시오. (감독으로 인해 Encoder::encode_from_utf8 이미 가지고있는 수정이 부족했습니다.)#[must_use] 로 결과 structs에 주석을 달 수 있습니다.parallel-utf8 ).simd-accel 사용하는 경우 UTF-8에서 UTF-8 DECODE SSE2- ACCELERATED를 만드십시오.const 에서 static 으로 Encoding 인스턴스에 대한 참조를 변경하여 참조를 사용하는 상자 전체에 대한 참조를 독특하게 만듭니다.FOO_INIT Encoding 인스턴스를 소개하여 외국 상자가 &'static Encoding static &'static Encoding 인 statics 를 갖는 Rust의 제약 조건 하에서 Encoding 인스턴스에 대한 참조로 정적 배열을 초기화 할 수 있도록하는 인코딩 인스턴스를 소개합니다.const 로 변경되면 위의 두 가지 점이 되돌아 가면 Cross-Crate 사용법이 참조를 고유하게 유지하도록하십시오.Cow S를 반환하십시오.Encoding::for_bom() BOM의 길이를 반환합니다.simd-accel 기능 플래그 뒤에 SSE2 가속도를 추가하십시오. (야간 녹이 필요합니다.)Encoder.encode_from_utf8_to_vec_without_replacement() 추가하십시오. Encoding.is_ascii_compatible() 추가하십시오.
Encoding::for_bom() .
Make == Encoding 사용 이름 비교를 위해 포인터 비교 대신 사용 이름 비교를 위해, 다른 상자에서 인코딩 상수의 사용은 다른 주소를 초래하고 상수는 다른 것들을 깨지 않고 정적으로 바꿀 수 없기 때문입니다.
초기 릴리스.