Skip to content

feat(ndc): configurable input_encoding (names + code pages) for NdcContentParser#16

Merged
RoboNET merged 1 commit into
mainfrom
feat/ndc-input-encoding
Jun 22, 2026
Merged

feat(ndc): configurable input_encoding (names + code pages) for NdcContentParser#16
RoboNET merged 1 commit into
mainfrom
feat/ndc-input-encoding

Conversation

@RoboNET

@RoboNET RoboNET commented Jun 22, 2026

Copy link
Copy Markdown
Owner

Closes #15

Что

NdcContentParser.ResolveEncoding теперь принимает любую кодировку, а не захардкоженный набор:

  • Имена: iso-8859-5, и т.д. (через Encoding.GetEncoding(name))
  • Числовые code page: 28595 (через Encoding.GetEncoding(int))
  • Fast-path сохранён для latin1/iso-8859-1, utf-8/utf8, ascii — возвращают framework-синглтоны без обращения к провайдеру.

Главный кейс из issue — печать кириллицы через ISO-8859-5 — работает.

Обработка ошибок

Неизвестная/некорректная кодировка → NotSupportedException с понятным сообщением (включает невалидное значение), вместо прежнего молчаливого fallback на Latin1.

Авто-регистрация провайдера

CodePagesEncodingProvider.Instance регистрируется в статическом конструкторе NdcContentParser (thread-safe, до первого GetEncoding), так что не-Latin1 ISO/Windows code pages доступны без настройки со стороны вызывающего. Пакет System.Text.Encoding.CodePages не нужен — тип в shared framework на net8.0/net10.0.

Бинарный путь

Parse(ReadOnlyMemory<byte>) приводит числовые input_encoding через ToString() (как NdcOptions.FromDictionary), иначе boxed int из YAML молча падал в Latin1.

AOT

Провайдер data-driven, без рефлексии/dynamic. IsAotCompatible=true сохранён, 0 trim/AOT warning.

Тесты

NdcBinaryParserTests: resolve по имени и номеру (CodePage == 28595), throw на неизвестном имени и code page, e2e декод кириллицы ISO-8859-5, e2e числовой boxed-int input_encoding. NDC: 22 passed. Полный прогон 3322 passed, 0 failed (net10.0).

ResolveEncoding now accepts any encoding name (e.g. iso-8859-5) or
numeric code page (e.g. 28595) in addition to the latin1/utf-8/ascii
fast paths. Unknown or invalid values throw NotSupportedException with
a clear message instead of silently falling back to Latin1.

CodePagesEncodingProvider is auto-registered in a static constructor so
non-Latin1 ISO/Windows code pages (Cyrillic via ISO-8859-5, etc.) are
available without caller setup. The binary parse path coerces numeric
input_encoding values via ToString, matching NdcOptions.FromDictionary.

Closes #15
@RoboNET RoboNET force-pushed the feat/ndc-input-encoding branch from b926b36 to fe8b587 Compare June 22, 2026 15:33
@RoboNET RoboNET merged commit 40f6cb7 into main Jun 22, 2026
7 checks passed
@RoboNET RoboNET deleted the feat/ndc-input-encoding branch June 22, 2026 15:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Добавить возможность задавать input_encoding для NdcContentParser

1 participant