Какая кодировка используются в Lua?

Страницы: Пред. 1 2
RSS
Какая кодировка используются в Lua?
 
Попробовал .cpp файл открыть в проводнике виновс и сохранить его в ANSI, как сохраняю скрипты под Lua, но при загрузке в Visual Studio C++ студия отображает русские символы как положено, т.е. перекодирует под себя. Раньше как то пользовался таким способом только в других ситуациях и помогало - при загрузке отображались иероглифы, но например в консоль шло то что надо.
 
За столько времени так никто и не ответил. Поддержка может хоть что-нибудь подсказать в решении проблемы? Мой вывод : в контексте толи потока QUIK, толь в Lua, локаль меняется с ru-Ru на локаль C, а в ней видимо русских букв вообще нету. Поэтому хоть что ты пиши, хоть кодируй текст - всё равно толку не будет, так как его попросту в чарактер сет(кодировке) нет как такового. Но почему не получается сначала  сохранить локаль C, потом установить родную локаль, вывести текст, потом локаь C вернуть обратно - не пойму.
 
Цитата
Alexander написал:
За столько времени так никто и не ответил. Поддержка может хоть что-нибудь подсказать в решении проблемы? Мой вывод : в контексте толи потока QUIK, толь в Lua, локаль меняется с ru-Ru на локаль C, а в ней видимо русских букв вообще нету. Поэтому хоть что ты пиши, хоть кодируй текст - всё равно толку не будет, так как его попросту в чарактер сет(кодировке) нет как такового. Но почему не получается сначала  сохранить локаль C, потом установить родную локаль, вывести текст, потом локаь C вернуть обратно - не пойму.
никогда не было проблемы с русскими буквами. Полагаю кодировка, которая в системе установлена.
 
 
Цитата
nikolz написал:
Цитата
Alexander написал:
За столько времени так никто и не ответил. Поддержка может хоть что-нибудь подсказать в решении проблемы? Мой вывод : в контексте толи потока QUIK, толь в Lua, локаль меняется с ru-Ru на локаль C, а в ней видимо русских букв вообще нету. Поэтому хоть что ты пиши, хоть кодируй текст - всё равно толку не будет, так как его попросту в чарактер сет(кодировке) нет как такового. Но почему не получается сначала  сохранить локаль C, потом установить родную локаль, вывести текст, потом локаь C вернуть обратно - не пойму.
никогда не было проблемы с русскими буквами. Полагаю кодировка, которая в системе установлена.
nikolz, вот я и не пойму толком ничего. Винда 10. У винды с 10-ой версии вроде что-то там как-то поменялось. Толи на юникод на какой-то другой перешли, толи ещё что. Наверное был до этого юникод 2-х байтовый(наверное u16), а сейчас полный u8(8 - это не биты) - так наверное. У Вас какая винда, что проблем нет? Блин, локаль показывает ru-Ru, что пользователя, что системы, в вызове из DLL - локаль C. Ну вроде же сменил локаль, потом вывел, нет всё равно на нерусском пишет. Думаю поди надо ещё в этой локали кодировку(чарактер сет) сменить. Буду пробовать. Но это потом, пока это не критично, надо главные функции писать.
 
Аааа, я ещё что-то сразу то не приметил. nikolz, Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
 
Цитата
Alexander написал:
Аааа, я ещё что-то сразу то не приметил.  nikolz , Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
попробуйте вызвать MessageBoxA
 
 
 
Цитата
Alexander написал:
Аааа, я ещё что-то сразу то не приметил.  nikolz , Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
Вы код из dll, который сообщение выводит покажите.
 
Цитата
Alexander написал:
Аааа, я ещё что-то сразу то не приметил.  nikolz , Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
У Вас по умолчанию подставляется  MessageBoxW
а надо прописать явно  MessageBoxA
----------------------
Вот ваш вариант с   MessageBoxW


а это с  MessageBoxA

 
 
В луа однобайтовая кодировка
 
Цитата
nikolz написал:
Цитата
Alexander написал:
Аааа, я ещё что-то сразу то не приметил.   nikolz  , Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
попробуйте вызвать MessageBoxA
Да я по всякому уже перепробовал, пробовал я и W варант и A вариант MessageBox-а, и просто коды букв вставлял для cp1251 из таблицы символов. Ни так, ни как не выводят по русски. Скрины:
 
nikolz, у Вас что за функции nkcf.defF и rfs ? Какой их код, что они вызывают API винды? И Вы их вызываете прямо из скрипта, а я API прямо из DLL на C.
 
Тут я кажется кое-что пряснил для себя. Вы, видимо используете этот подход: https://forum.quik.ru/forum10/topic7971/, тем более сами писали. Я правильно понял? Я использую этот подход: https://forum.quik.ru/forum10/topic7971/
Хотелось бы решить задачу в своём подходе.
 
Цитата
Alexander написал:
nikolz , у Вас что за функции nkcf.defF и rfs ? Какой их код, что они вызывают API винды? И Вы их вызываете прямо из скрипта, а я API прямо из DLL на C.
Это мой аналог библиотеки FFI,,
Эти функции позволяют вызывать в луа функции из dll, у которых интерфейс C.
любые функции из системных библиотек и сторонних dll
нет надобности городить что-то на API C for Lua.
Я об это на форуме уже писал.
-------------------------
правда я встроил LuaJIT в QUIK и могу использовать и FFI.
Тоже об этом писал на форуме.
 
Ошибочка в ссылке. Мой подход: https://quik2dde.ru/viewtopic.php?id=18
 
Цитата
Alexander написал:
Тут я кажется кое-что пряснил для себя. Вы, видимо используете этот подход:  https://forum.quik.ru/forum10/topic7971/ , тем более сами писали. Я правильно понял? Я использую этот подход:  https://forum.quik.ru/forum10/topic7971/
Хотелось бы решить задачу в своём подходе.
У меня есть dll на основе API C for Lua  
Результат будет такой же.
Просто сделайте как я Вам написал и увидите результат.
Либо измените опции в компиляторе
 
Ну так у меня и есть dll на основе API C for Lua, но только результат совсем не такой как хотелось бы.
Цитата
nikolz написал:
Просто сделайте как я Вам написал и увидите результат.
Что именно сделать? Перейти на аналог ffi? Если это имелось в виду, то это надо отдельно сейчас вникать в эту тему. Несомненно тема того стоит, изучить надо её. Но думаю, что всё что мне хотелось бы этот подход не решит. Мне напрмер нужно своё окно со своей callback оконной процедурой, потому, что в неё онлайн будут со скрипта QUIK-а поступать данные и она будет рисовать мне опционные стратегии в онлайн режиме. Трансляция цен на покупки-продажи опционов по бидам и офферам, смотря что надо - покупать или продавать и страйки и база и по этим данным график будет меняющийся на глазах в зависимости от этих данных.
 
Если имелось ввиду заменить MessageBox  на MessageBoxA, так я так уже пробовал. По умолчанию да юникод в свойствах проекта и функция из макроса MessageBox подставляется MessageBoxW, я это знаю. Замена ничего не меняет абсолютно. MessageBox, что один, что другой вызываются из оконной процедуры у меня.
 
Цитата
nikolz написал:
правда я встроил LuaJIT в QUIK и могу использовать и FFI.Тоже об этом писал на форуме.
Есть прямая ссылка на тему, как этот JIT прикрутить к квику?  
 
Цитата
Alexander написал:
Да я по всякому уже перепробовал, пробовал я и W варант и A вариант MessageBox-а, и просто коды букв вставлял для cp1251 из таблицы символов. Ни так, ни как не выводят по русски. Скрины:
Судя по скрину, у тебя настройки проекта юникодные, и скорее всего сам файл исходника в юникоде.
Нужно все переключить в анси. Это самый простой путь.

Хотя вариант MessageBoxW(..., L"Русский текст"...) должен работать.
Но это все время сложности с кодировкой. Оно надо? Проще все переклюить в анси.
 
Цитата
Alexander написал:
Цитата
nikolz написал:
 
Цитата
Alexander  написал:
Аааа, я ещё что-то сразу то не приметил.    nikolz   , Вы  на скрине показываете окно сообщений самого квика. Мои скрипты в это окно пишут по-русски нормально. Я писал не про это окно. У меня DLL. Скрипт вызывает её функции. Эти функции например вызывают MessageBox виндовую для вызова окна сообщенй винды с русским текстом. И вот оно то пишет не по-русски. Вот в этом проблема. А с простым message в скрипте проблем нет - сохраняю с русскими сообщениями как ANSI и проблем нет. Вобщем сама винда перестаёт по-русски писать в своём же сообщении, хотя если вызывать  не из библиотеки DLL под QUIK, а просто из программы под винду, то пишет по-русски как положено. И ещё. Из DLL в этом окне только само сообщение абракадаброй выводится, а вот кнопки "Да", "Нет" - они нормально по-русски подписаны.
 попробуйте вызвать MessageBoxA
Да я по всякому уже перепробовал, пробовал я и W варант и A вариант MessageBox-а, и просто коды букв вставлял для cp1251 из таблицы символов. Ни так, ни как не выводят по русски. Скрины:
У вас строчка "Закрыть приложение?" в utf-8. А MessageBoxA хочет cp1251.
 
Цитата
Alexander написал:
Если имелось ввиду заменить MessageBox  на MessageBoxA, так я так уже пробовал. По умолчанию да юникод в свойствах проекта и функция из макроса MessageBox подставляется MessageBoxW, я это знаю. Замена ничего не меняет абсолютно. MessageBox, что один, что другой вызываются из оконной процедуры у меня.
какой IDE используете?
Могу посоветовать для написания dll для Lua(QUIK) использовать Pelles C.
Очень хороший, простой в настройках, быстрый по сравнению с Visual Studio .
 
и еще..
для отладки dll для lua советую использовать SciTe (редактор текста на Lua с встроенным компилятором )
 
Alexander, строки текста откуда берутся? в cpp файле в тексте программы?
А cpp-файлы в какой кодировке-то у вас сохранены? сможете определить?
 
Цитата
swerg написал:
Alexander, строки текста откуда берутся? в cpp файле в тексте программы?
А cpp-файлы в какой кодировке-то у вас сохранены? сможете определить?
Так то кодировка исходника может отличаться от кодировки, в которой будет строка после компиляции https://learn.microsoft.com/en-us/cpp/build/reference/execution-charset-set-execution-character-set?...
 
Короче я разобрался. Оказывается все исходники у меня были на ANSI, а вот один файл был на UTF-8. Как так получилось, что я его сохранял специально  в ANSI и потом компилял весь проект и тоже не работала - не пойму. Что-то по запарке видимо не то сделал, поэтому и промучился долго. Раньше так и делал. Весь код в ANSI изначально и сто процентов выведет на русском, тем более QUIK в 1251 работает. А студия файлы по разному может сохранять. Вот этот почему-то по умолчанию в UTF-8 сделала, а другой проект отдельно делал - там студия сама ANSI сохранила. Но я не стал заморачиваться с перекодировками, я просто флаги компилятору указал, чтобы исходники все как UTF-8 сохранял, а кодировку выполнения делал во время компиляции как cp1251. При компиляции много сообщений, что не может некоторые символы из ANSI файлов в UTF-8 переделать(там русские комменты были), поэтому ANSI-шные так и остались как есть, а один файл он был в UTF-8 уже, тоже получается остался как есть, но зато русский код сразу мне во время компиляции сгенерил в cp1251 и всё сейчас работает. На будущее сразу надо не забывать проверять и желательно всё в ANSI, чтобы без проблем или компилятору указывать флаги на нужную кодировку выполнения - то есть то что будет в скомпилированной программе на выходе после компилятора и в какой кодировке.
Не выводил потому, что в UTF-8 был русский закодирован на время выполнения, поэтому ни MessageBoxA, ни MessageBoxW естественно не могли его раскодировать, так как у Microsoft MessageBoxW типа широкие символы, и типа это UTF кодировка, но не та, у них wide char это UTF-16LE двухбайтовый. А UNF-8 от только английские символы одним байтом кодирует и если всё на английском, то будет одинаково, что на ANSI, что на UTF-8. Эти юникоды разные варианты есть. UTF-8 он кодировать может 1-4 байт на символ, UTF-16 от 2-4 байт на символ, а ещё BE или LE, UTF-32 там строго 4 байта на символ и тоже BE или LE.
 
Цитата
paluke написал:
Цитата
swerg написал:
Alexander, строки текста откуда берутся? в cpp файле в тексте программы?
А cpp-файлы в какой кодировке-то у вас сохранены? сможете определить?
Так то кодировка исходника может отличаться от кодировки, в которой будет строка после компиляции  https://learn.microsoft.com/en-us/cpp/build/reference/execution-charset-set-execution-character-set?...
Да, я когда разбирался со всем этим, то как раз тоже на это пояснилово от Майкрософта наткнулся - этим и воспользовался потом.
Страницы: Пред. 1 2
Читают тему
Наверх