Bug 47189 - Команда "natspec -a" работает противоположно ожидаемому
Summary: Команда "natspec -a" работает противоположно ожидаемому
Status: CLOSED WORKSFORME
Alias: None
Product: Sisyphus
Classification: Development
Component: libnatspec (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Vitaly Lipatov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-08-10 14:31 MSK by Artem Varaksa
Modified: 2023-08-12 14:28 MSK (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2023-08-10 14:31:43 MSK
Описание ошибки
===============

Описание команды ($ natspec -a) ("transliterate args from ENC to current encoding and print it") можно понимать как "транслитерировать аргумент(ы) из предоставленной кодировки (ENC) в текущую кодировку и вывести его".

Это подтверждается и ошибкой, возникающей при запуске ($ natspec -a test тест):

> Broken encoding: '' (to) or 'test' (from) or UCS2. May be you forget setlocale in main or gconv-modules is missed?

Т. е. исходя из "'test' (from)" кодировка, указанная в аргументе `-a`, является исходной (from) кодировкой. Целевой кодировкой (to) должна быть системная кодировка (UTF-8).

Однако команда, похоже, выполняет обратное действие (если это не так, следует уточнить описание команды в $ natspec -h).



Так, при выполнении ($ natspec -a koi8r "тест") ожидается конвертация из KOI8-R в UTF-8, но на самом деле происходит обратное: 

> Clean charset 'UTF-8', after: 'UTF8'get_entry_by_charset charset=UTF8
> Find with charset 'UTF8'
> 1582519872 (ucs2: 0), тест:8
> я┌п╣я│я┌

Соответственно, при выполнении ($ natspec -a koi8r "я┌п╣я│я┌"):

> Clean charset 'UTF-8', after: 'UTF8'get_entry_by_charset charset=UTF8
> Find with charset 'UTF8'
> -987826624 (ucs2: 0), я┌п╣я│я┌:20
> я▐Б■▄п©Б∙ёя▐Б■┌я▐Б■▄



Ожидаемый результат при выполнений последней команды - такой, который получается при выполнении ($ LANG=ru_RU.KOI8-R natspec -a utf8 "я┌п╣я│я┌"):

> Clean charset 'KOI8-R', after: 'KOI8R'get_entry_by_charset charset=KOI8R
> Find with charset 'KOI8R'
> -2079856992 (ucs2: 0), я┌п╣я│я┌:20
> тест


Примечание
==========

Примеры вывода предоставлены для версии libnatspec-0.3.1-alt3.x86_64 из задания 325550 с включённым DEBUG (в файле lib/natspec_internal.h "#define DEBUG(n)" заменено на "#define DEBUG(n) n").

Основное поведение (не-DEBUG вывод) не отличается на указанных в разделе "Воспроизводимость" версиях.


Воспроизводимость
=================

Воспроизводится на виртуальных машинах:

[p10] libnatspec-0.3.1-alt2.x86_64
kworkstation-10.1-x86-64
education-10.1-x86-64
education-10.1-x86-64-kde
workstation-10.1-x86-64
server-10.1-x86-64

[sisyphus] libnatspec-0.3.2-alt1.x86_64
kworkstation-10.1-x86-64
education-10.1-x86-64
education-10.1-x86-64-kde
workstation-10.1-x86-64
server-10.1-x86-64
Comment 1 Vitaly Lipatov 2023-08-12 14:28:45 MSK
Нет, всё корректно работает:
$ LANG=C natspec -a UTF-8 "Проверка связи"
Proverka svyazi

Перекодирует из указанной кодировки в кодировку локали, транслитерируя при необходимости.

$ LANG=ru_RU.KOI8-R natspec -a UTF-8 "Проверка связи" | iconv -f koi8-r
Проверка связи


По сути предназначена для вывода строки в известной кодировке, даже если в целевую локаль перекодировать не удаётся.

$ LANG=en_US natspec -a "UTF-8" "Проверка связи"
Proverka svyazi

$ LANG=en_US natspec -a "KOI8-R" "Проверка связи"
p�ya-p+p+p+ya-p+p+ ya|p+yaRBp+p+