Неверное отображение кириллицы из консоли командной строки

Простейшие вопросы в области инженерной разработки
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Неверное отображение кириллицы из консоли командной строки

Сообщение Юрий »

К кирилице не было вопросов пока не потребовалось выводить текст в обычный текстовый контрол из консоли командной строки (System Exec). Если в консоли скопировать текст и вставить в тот же контрол, то всё нормально. Куда в первую очередь надо копнуть?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3402
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Отображение кирилици неверное

Сообщение Artem.spb »

кодировки разные, туда и копать

Это решение у меня работает
https://forums.ni.com/t5/LabVIEW/System ... 3#M1048560
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение Юрий »

Artem.spb писал(а): 19 янв 2022, 22:17 Это решение у меня работает
https://forums.ni.com/t5/LabVIEW/System ... 3#M1048560
Спасибо, помогло.
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение Юрий »

Artem.spb писал(а): 19 янв 2022, 22:17 Это решение у меня работает
https://forums.ni.com/t5/LabVIEW/System ... 3#M1048560
Есть некий нюанс. При повторном выполнении в конце появляется грязь. Избавиться удалось, используя последний выход "cchDstLength".
Команды.png
Вложения
Команды.vi
(16.09 КБ) 48 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение dadreamer »

Юрий писал(а): 21 янв 2022, 01:53Есть некий нюанс. При повторном выполнении в конце появляется грязь.
Ожидаемо. Видимо, тот, кто этот :vi: делал, плохо представлял, как хранятся в памяти C-строки. А вообще, мы это уже проходили: viewtopic.php?p=64602#p64602
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение ujin1 »

dadreamer писал(а): 21 янв 2022, 08:36
Юрий писал(а): 21 янв 2022, 01:53Есть некий нюанс. При повторном выполнении в конце появляется грязь.
Ожидаемо. Видимо, тот, кто этот :vi: делал, плохо представлял, как хранятся в памяти C-строки. А вообще, мы это уже проходили: viewtopic.php?p=64602#p64602
Как вариант он мог подумать, что там pascal string. Наличие входа размер строки на это намекает.
Изображение
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение dadreamer »

ujin1 писал(а): 21 янв 2022, 13:18Как вариант он мог подумать, что там pascal string. Наличие входа размер строки на это намекает.
Надо было всего-то зайти на MSDN и прочитать описание функции.
OemToCharBuffA
[out] LPSTR lpszDst
Windows Data Types
LPSTR

A pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CHAR *LPSTR;
Ну, и третий параметр cchDstLength там для того, чтобы скопировать точно заданное количество байт, а не остановиться по достижении \00.
Unlike the OemToChar function, the OemToCharBuff function does not stop converting characters when it encounters a null character in the buffer pointed to by lpszSrc. The OemToCharBuff function converts all cchDstLength characters.
Кстати, можно даже не заморачиваться с буфером и выполнить in-place конвертацию.
2022-01-21_16-16-48.jpg
2022-01-21_16-16-48.jpg (17.71 КБ) 1854 просмотра
Только надо в настройках CLFN выставить галочки "Constant" для обоих входных параметров, чтобы :labview: передал в функцию оригинальные указатели вместо копий.
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение Юрий »

dadreamer писал(а): 21 янв 2022, 08:36 А вообще, мы это уже проходили: viewtopic.php?p=64602#p64602
Даааа, я даже не помню, что когда то занимался этим вопросом. Ну, что бы без Вас делал, думаю, не только я.
Только надо в настройках CLFN выставить галочки "Constant" для обоих входных параметров, чтобы :labview: передал в функцию оригинальные указатели вместо копий.
А на единицу надо увеличивать строку? Помниться, что то такое было.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение dadreamer »

Юрий писал(а): 21 янв 2022, 20:41А на единицу надо увеличивать строку? Помниться, что то такое было.
Если так, как на картинке выше, то не надо. Просто заводите строку на два входных терминала, настраиваете её как C String Pointer + Constant и дело с концом.
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение ujin1 »

dadreamer писал(а): 21 янв 2022, 13:59 Надо было всего-то зайти на MSDN и прочитать описание функции.
Я думал нужно было угадать. Так не честно. Вы воспользовались подсказой (шутка).
Все равно не все понятно.

LPCSTR понимается так.
• LP — Long Pointer (длинный указатель)
• C – Constant (константа)
• STR – String (строка)
По сути LPCSTR это (Длинный) указатель на строку.

Если это так же тип с терминальными нулями на конце функция должна определить длину строки и преобразовать количество символов до нулей (если не указано).
Но длина строки указана.
Далее при передаче строки обратно в LabVIEW должна читаться строка той длины, которая была на входе и терминальные нули остаются в конце.
LabVIEW передает в Call Library Function Node строку в формате С String Pointer. Так же LabVIEW знает что такое Pascal String Pointer
Я проверил. Мусора не обнаружил. Ни в начале строки ни в конце ни при повторном вызове. Если не указать размер на входе, то возвращается строка 0 длины.
Так же и в Вашем примере и в примере от Юрия.
OemToCharBuffA.png
Почему именно при повторном выполнении появляется грязь так же непонятно.
Изображение
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение Юрий »

ujin1 писал(а): 22 янв 2022, 07:29 Почему именно при повторном выполнении появляется грязь так же непонятно.
Я не проверял, но уверен, что мусор при повторном выполнении появляется потому, что при первом размер строки был больше. Просто на неё накладыватся новая меньшая строка, а остаток этого "больше" так и остаётся.
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение ujin1 »

Юрий писал(а): 22 янв 2022, 16:05 Я не проверял, но уверен, что мусор при повторном выполнении появляется потому, что при первом размер строки был больше. Просто на неё накладыватся новая меньшая строка, а остаток этого "больше" так и остаётся.
Ранее Вы писали - Избавиться удалось, используя последний выход "cchDstLength"
Т.е. при использовании входа длины мусор убрался, следовательно мусор остается только в Call Library Function Node.
Когда я оставил вход "cchDstLength" неподключенным, строка на выходе была пустая сразу. Так как если бы функция получила 0 и выдала строку длиной 0.
Больше похоже на баг самой функции. Я проверил в WIN10 21H1.
Изображение
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение dadreamer »

ujin1 писал(а): 22 янв 2022, 18:05Больше похоже на баг самой функции.
Мне удалось это воспроизвести. Это нюанс :labview: , на самом деле. И почему-то сразу не бросилось в глаза. Нужно проинициализировать входной терминал пустой строкой.
2022-01-24_13-42-36.jpg
Если этого не делать, то :labview: повторно использует ранее выделенный буфер. Сверху размер буфера никак не лимитирован, снизу - да, через опцию Minimum size. Если ранее буфер был больше, чем сейчас, то в нём останется "хвост" от предыдущего вызова (Юрий выше уже написал об этом). Вероятно, когда-то давно в этом был некоторый смысл: зачем лишний раз выделять память, если она уже выделена. В настоящее время это больше атавизм. Тем более, что рекомендуется буфер всегда выделять явно (например, с помощью Initialize Array), а не отдавать это на откуп компилятору.
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Отображение кирилици неверное

Сообщение ujin1 »

dadreamer писал(а): 24 янв 2022, 11:53 Сверху размер буфера никак не лимитирован, снизу - да, через опцию Minimum size
...Избавиться удалось, используя последний выход "cchDstLength"...
Если я его не использую (= не подключаю) на выходе всегда пустая строка. С самого первого выполнения.
Различное поведение одной и той же функции у разных пользователей. Что так может быть информация не новая, так отметить для памяти.
WIN10 21H1 LabVIEW 19.0.1f5 (32-bit).
Изображение
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Неверное отображение кириллицы из консоли командной строки

Сообщение dadreamer »

ujin1, хотите сказать, что на вашей системе такого не происходит?
Вложения
Screenshot_1.jpg
Screenshot_3.jpg
Screenshot_2.jpg
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»