Неверное отображение кириллицы из консоли командной строки
-
- leader
- Сообщения: 526
- Зарегистрирован: 28 фев 2010, 18:04
- Версия LabVIEW: LV2018
- Благодарил (а): 10 раз
- Поблагодарили: 18 раз
- Контактная информация:
Неверное отображение кириллицы из консоли командной строки
К кирилице не было вопросов пока не потребовалось выводить текст в обычный текстовый контрол из консоли командной строки (System Exec). Если в консоли скопировать текст и вставить в тот же контрол, то всё нормально. Куда в первую очередь надо копнуть?
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Отображение кирилици неверное
кодировки разные, туда и копать
Это решение у меня работает
https://forums.ni.com/t5/LabVIEW/System ... 3#M1048560
Это решение у меня работает
https://forums.ni.com/t5/LabVIEW/System ... 3#M1048560
-
- 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
- Сообщения: 526
- Зарегистрирован: 28 фев 2010, 18:04
- Версия LabVIEW: LV2018
- Благодарил (а): 10 раз
- Поблагодарили: 18 раз
- Контактная информация:
Re: Отображение кирилици неверное
Есть некий нюанс. При повторном выполнении в конце появляется грязь. Избавиться удалось, используя последний выход "cchDstLength".Artem.spb писал(а): ↑19 янв 2022, 22:17 Это решение у меня работает
https://forums.ni.com/t5/LabVIEW/System ... 3#M1048560
- Вложения
-
- Команды.vi
- (16.09 КБ) 48 скачиваний
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Отображение кирилици неверное
Ожидаемо. Видимо, тот, кто этот делал, плохо представлял, как хранятся в памяти C-строки. А вообще, мы это уже проходили: viewtopic.php?p=64602#p64602
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Отображение кирилици неверное
Как вариант он мог подумать, что там pascal string. Наличие входа размер строки на это намекает.dadreamer писал(а): ↑21 янв 2022, 08:36Ожидаемо. Видимо, тот, кто этот делал, плохо представлял, как хранятся в памяти C-строки. А вообще, мы это уже проходили: viewtopic.php?p=64602#p64602
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Отображение кирилици неверное
Надо было всего-то зайти на MSDN и прочитать описание функции.
OemToCharBuffA
Windows Data Types[out] LPSTR lpszDst
Ну, и третий параметр cchDstLength там для того, чтобы скопировать точно заданное количество байт, а не остановиться по достижении \00.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;
Кстати, можно даже не заморачиваться с буфером и выполнить in-place конвертацию. Только надо в настройках CLFN выставить галочки "Constant" для обоих входных параметров, чтобы передал в функцию оригинальные указатели вместо копий.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.
-
- leader
- Сообщения: 526
- Зарегистрирован: 28 фев 2010, 18:04
- Версия LabVIEW: LV2018
- Благодарил (а): 10 раз
- Поблагодарили: 18 раз
- Контактная информация:
Re: Отображение кирилици неверное
Даааа, я даже не помню, что когда то занимался этим вопросом. Ну, что бы без Вас делал, думаю, не только я.dadreamer писал(а): ↑21 янв 2022, 08:36 А вообще, мы это уже проходили: viewtopic.php?p=64602#p64602
А на единицу надо увеличивать строку? Помниться, что то такое было.Только надо в настройках CLFN выставить галочки "Constant" для обоих входных параметров, чтобы передал в функцию оригинальные указатели вместо копий.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Отображение кирилици неверное
Если так, как на картинке выше, то не надо. Просто заводите строку на два входных терминала, настраиваете её как C String Pointer + Constant и дело с концом.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Отображение кирилици неверное
Я думал нужно было угадать. Так не честно. Вы воспользовались подсказой (шутка).
Все равно не все понятно.
LPCSTR понимается так.
• LP — Long Pointer (длинный указатель)
• C – Constant (константа)
• STR – String (строка)
По сути LPCSTR это (Длинный) указатель на строку.
Если это так же тип с терминальными нулями на конце функция должна определить длину строки и преобразовать количество символов до нулей (если не указано).
Но длина строки указана.
Далее при передаче строки обратно в LabVIEW должна читаться строка той длины, которая была на входе и терминальные нули остаются в конце.
LabVIEW передает в Call Library Function Node строку в формате С String Pointer. Так же LabVIEW знает что такое Pascal String Pointer
Я проверил. Мусора не обнаружил. Ни в начале строки ни в конце ни при повторном вызове. Если не указать размер на входе, то возвращается строка 0 длины.
Так же и в Вашем примере и в примере от Юрия. Почему именно при повторном выполнении появляется грязь так же непонятно.
-
- leader
- Сообщения: 526
- Зарегистрирован: 28 фев 2010, 18:04
- Версия LabVIEW: LV2018
- Благодарил (а): 10 раз
- Поблагодарили: 18 раз
- Контактная информация:
Re: Отображение кирилици неверное
Я не проверял, но уверен, что мусор при повторном выполнении появляется потому, что при первом размер строки был больше. Просто на неё накладыватся новая меньшая строка, а остаток этого "больше" так и остаётся.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Отображение кирилици неверное
Ранее Вы писали - Избавиться удалось, используя последний выход "cchDstLength"
Т.е. при использовании входа длины мусор убрался, следовательно мусор остается только в Call Library Function Node.
Когда я оставил вход "cchDstLength" неподключенным, строка на выходе была пустая сразу. Так как если бы функция получила 0 и выдала строку длиной 0.
Больше похоже на баг самой функции. Я проверил в WIN10 21H1.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Отображение кирилици неверное
Мне удалось это воспроизвести. Это нюанс , на самом деле. И почему-то сразу не бросилось в глаза. Нужно проинициализировать входной терминал пустой строкой. Если этого не делать, то повторно использует ранее выделенный буфер. Сверху размер буфера никак не лимитирован, снизу - да, через опцию Minimum size. Если ранее буфер был больше, чем сейчас, то в нём останется "хвост" от предыдущего вызова (Юрий выше уже написал об этом). Вероятно, когда-то давно в этом был некоторый смысл: зачем лишний раз выделять память, если она уже выделена. В настоящее время это больше атавизм. Тем более, что рекомендуется буфер всегда выделять явно (например, с помощью Initialize Array), а не отдавать это на откуп компилятору.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Отображение кирилици неверное
...Избавиться удалось, используя последний выход "cchDstLength"...
Если я его не использую (= не подключаю) на выходе всегда пустая строка. С самого первого выполнения.
Различное поведение одной и той же функции у разных пользователей. Что так может быть информация не новая, так отметить для памяти.
WIN10 21H1 LabVIEW 19.0.1f5 (32-bit).
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Неверное отображение кириллицы из консоли командной строки
ujin1, хотите сказать, что на вашей системе такого не происходит?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение