Какая кодировка используются в Lua? Windows - 1251? Например, если терминал будет установлен на английскую версию винды, терминал тоже будет отдавать строки в Windows - 1251 или в системной кодировке?
Александр, Зачем? Нам нет смысла отдельно проводить исследования. Если Вам интересен ответ, Вы можете узнать его самостоятельно, либо попробовать поискать ответ в интернете. Lua разработан не нами, наверняка на форумах которые ему посвящены Вы найдете что то нужно.
Sergey Gorokhov написал: Александр, Зачем? Нам нет смысла отдельно проводить исследования. Если Вам интересен ответ, Вы можете узнать его самостоятельно, либо попробовать поискать ответ в интернете. Lua разработан не нами, наверняка на форумах которые ему посвящены Вы найдете что то нужно.
Странный ответ. При чем здесь lua? Терминал же сохраняет строки для дальнейшего использования в луа? Вот я хочу узнать, что вы туда записываете.
Александр написал: В какой кодировке будут строки, если вызвать lua_tolstring для преобразования в unicode?
А как вы вызовете lua_tolstring для преобразования в unicode? Она просто вернет пойнтер на строку в хранилище и все, никаких преобразований не случится. Аналогично lua_pushstring ничего не будет преобразовывать, как дали ей массив байтов, так она их в хранилище и засунет. Отсюда вывод: в какой кодировке скормили, в той и назад получите. Сравнение строк на равенство тоже побайтово делается. Единственное - это сравнение на неравенство, луа вызывает strcoll и поэтому правильный вопрос к арке будет такой: какую локаль устанавливает квик при старте? Мое предположение - locale("").
Александр написал: Странный ответ. При чем здесь lua? Терминал же сохраняет строки для дальнейшего использования в луа?Вот я хочу узнать, что вы туда записываете.
Странный вопрос, Вы же спрашиваете про Lua, а не про терминал QUIK. О tostring нам известно не больше чем то что написано в официальной документации на сайте lua.org Если интересует в какой кодировке сервер QUIK отправляет данные на терминал, то в ANSI.
Александр написал: В какой кодировке будут строки, если вызвать lua_tolstring для преобразования в unicode?
А как вы вызовете lua_tolstring для преобразования в unicode? Она просто вернет пойнтер на строку в хранилище и все, никаких преобразований не случится. Аналогично lua_pushstring ничего не будет преобразовывать, как дали ей массив байтов, так она их в хранилище и засунет. Отсюда вывод: в какой кодировке скормили, в той и назад получите. Сравнение строк на равенство тоже побайтово делается. Единственное - это сравнение на неравенство, луа вызывает strcoll и поэтому правильный вопрос к арке будет такой: какую локаль устанавливает квик при старте? Мое предположение - locale("").
Вопрос заключается в какой кодировке будет строка? В ansi не написано в какой кодировке будет. Если это будет в системной кодировке, то не понятно как быть с кириллическими символами. Если в Windows - 1251, то понятно как дальше преобразовать в уникод. Так что вопрос заключается в том, в какой кодировке изначально строка попадает в таблицу луа - в системной или windows - 1251 не зависимо от системной кодировки.
Александр написал: Странный ответ. При чем здесь lua? Терминал же сохраняет строки для дальнейшего использования в луа?Вот я хочу узнать, что вы туда записываете.
Странный вопрос, Вы же спрашиваете про Lua, а не про терминал QUIK. О tostring нам известно не больше чем то что написано в официальной документации на сайте lua.org Если интересует в какой кодировке сервер QUIK отправляет данные на терминал, то в ANSI.
Кодировка то какая всегда windows-1251? Или зависит от настроек сервера?
Александр написал: в какой кодировке изначально строка попадает в таблицу луа
Я всю жизнь CP_ACP для преобразований в-из анси использую и никто еще не жаловался.
Хорошо. Если кодировка Windows - 1251, то в терминале где нет кирилицы, будут проблемы. А сервер квик не знает, какая кодировка у клиента на компьютере есть, а какой нету.
Sergey Gorokhov написал: Но они как правило решаются настройкой "язык для программ, не поддерживающих юникод" = русский
Или, как йже было сказано, не использовать русский там где нет русской кирилицы терминал QUIK умеет переключаться на английский
В этом случае какая кодировка будет? Например в таблице инструментов есть поле name - наименование инструмента и оно может быть на русском языке. Тут что будет?
Sergey Gorokhov написал: Александр, Вам уже дали ответ, какой еще вариант вам нужен? Везде используется ANSI Всегда Во всех данных во всех языках.
Всегда и везде будет кодировка windows-1251 или она зависит от терминала (его языка), ос (наличие кирилицы или нет) или сервека квик? Я так знаю, что все строки в ANSI. Вопрос изначально был: кодировка строк windows-1251 или зависит от ос (CP_ACP) или сервера квик?
Александр написал: Всегда и везде будет кодировка windows-1251 или она зависит от терминала (его языка), ос (наличие кирилицы или нет) или сервека квик?
Вы задаете одни и теже вопросы по кругу. Вам уже дали ответ:
Цитата
Sergey Gorokhov написал: зависит от настроек сервера, но как правило большая часть (или вообще все) используют кодировку ANSI с кодовой таблицей Windows-1251
Александр написал: Всегда и везде будет кодировка windows-1251 или она зависит от терминала (его языка), ос (наличие кирилицы или нет) или сервека квик?
Вы задаете одни и теже вопросы по кругу. Вам уже дали ответ:
Цитата
Sergey Gorokhov написал: зависит от настроек сервера, но как правило большая часть (или вообще все) используют кодировку ANSI с кодовой таблицей Windows-1251
Получается, что в терминале на английском языке на английской винде, в таблице текущих параметров в поле бумага - будет аракадабра?
Sergey Gorokhov написал: Но они как правило решаются настройкой "язык для программ, не поддерживающих юникод" = русский
Или, как йже было сказано, не использовать русский там где нет русской кирилицы терминал QUIK умеет переключаться на английский
Отображение значений полей зависит от языка терминала? Не всегда есть возможность переключатся на язык для программ, не поддерживающих уникод. Терминал не поддерживает уникод в 2020 году. Получается терминал в китайской винде работать не будет, даже его английская версия? Значения полей не верно будут отображаться. Так получается?
Александр написал: В русском терминале название акции - "Газпром", а в английском - она будет называться по-другому?
Вы задаете одни и теже вопросы по кругу. Вам уже дали ответ:
Цитата
Sergey Gorokhov написал: Логично что если в настройках терминала выбран английский то и интерфейс и все значения будут на английском.
Ответить прямо религия запрещает? Мне ваши ответы не понятны, поэтому задаю уточнящие вопросы. Есть ли квик джуниор с интерфейсом на английском языке для теста?
на самом деле переменная в которую записываем строку не содержит указатель на строку, а содержит хэш строки. поэтому сравнение строк в луа делается быстро как и для числе, так как сравниваются числа хэш
Lua is 8-bit clean: strings can contain any 8-bit value, including embedded zeros ('\0'). Lua is also encoding-agnostic; it makes no assumptions about the contents of a string.
Александр написал: Ответить прямо религия запрещает? Мне ваши ответы не понятны, поэтому задаю уточнящие вопросы.
Что именно не понятно во фразе "интерфейс и все значения будут на английском"?
Цитата
Александр написал: В русском терминале название акции - "Газпром", а в английском - она будет называться по-другому?
Хорошо, отвечаем прямо, да будет по другому, а если точнее по английски, а если еще точнее то GAZPROM. такой ответ понятен?
Цитата
Александр написал: Есть ли квик джуниор с интерфейсом на английском языке для теста?
отдельного терминала QUIK на английском языке не существует. Есть просто терминал, и в нем есть просто настройка, которую просто надо поменять. меню Система - Настройки - Языковые установки. Нюанс в том, что не каждый сервер брокера поддерживает английский, это можно уточнить у брокера.
Николай Камынин написал: tostring работает со строками в коде ASCII (American Standart Code for Inmormation Interchange) вернее ASCIIZ
Абсолютно неверное утверждение. В случае автоматического преобразования числа в строку да, получается ASCIIZ (а можно сказать, что получается utf-8 или win-1251 или что угодно, т.к. первая страница у всех codepage одинаковая, если не учитывать экзотику), но в случае строки возвращается строка как она есть, ровно в том виде, в каком ее туда засунули, в том числе со внутренними нулями (что автоматически отвергает ASCIIZ и, кстати, позволяет при некоторой осторожности впихнуть даже utf-16).
Александр написал: Ответить прямо религия запрещает? Мне ваши ответы не понятны, поэтому задаю уточнящие вопросы.
Что именно не понятно во фразе "интерфейс и все значения будут на английском"?
Цитата
Александр написал: В русском терминале название акции - "Газпром", а в английском - она будет называться по-другому?
Хорошо, отвечаем прямо, да будет по другому, а если точнее по английски, а если еще точнее то GAZPROM. такой ответ понятен?
Цитата
Александр написал: Есть ли квик джуниор с интерфейсом на английском языке для теста?
отдельного терминала QUIK на английском языке не существует. Есть просто терминал, и в нем есть просто настройка, которую просто надо поменять. меню Система - Настройки - Языковые установки. Нюанс в том, что не каждый сервер брокера поддерживает английский, это можно уточнить у брокера.
Квик джуниор, который подключается к вашему демо серверу, поддерживает английский?
Николай Камынин написал: tostring работает со строками в коде ASCII (American Standart Code for Inmormation Interchange) вернее ASCIIZ
Абсолютно неверное утверждение. В случае автоматического преобразования числа в строку да, получается ASCIIZ (а можно сказать, что получается utf-8 или win-1251 или что угодно, т.к. первая страница у всех codepage одинаковая, если не учитывать экзотику), но в случае строки возвращается строка как она есть, ровно в том виде, в каком ее туда засунули, в том числе со внутренними нулями (что автоматически отвергает ASCIIZ и, кстати, позволяет при некоторой осторожности впихнуть даже utf-16).
Цитата
Николай Камынин написал: tostring вообще-то все равно какая кодировка
поясняю для тех кто в танке -------------------------- текст в любой кодировке - это массив байт конец массива обозначается нулевым байтом, поэтому в массивах с текстом запрещен нулевой байт но если в массиве байтов нет нуля то это может быть массив не текста --------------------- знание кодировки требуется лишь генератору символов на устройстве отображения ------------------ поэтому если отображения нет , то кодировка не имеет значение, если все строки текста в программе имеют одинаковую кодировку то с ними можно работать как с массивами байт ---------------------- оператору tostring вообще не требуется знать кодировки так как его задача заменить хеш указателем на массив байт с нулем в конце
текст в любой кодировке - это массив байт конец массива обозначается нулевым байтом, поэтому в массивах с текстом запрещен нулевой байт но если в массиве байтов нет нуля то это может быть массив не текста
Николай Камынин написал: текст в любой кодировке - это массив байт
Вообще все в компьютере это массив байт. Остальное все неверно. Ноль в конце это чисто сишная фишка, в паскале их нет например. Строка это не байты, а codepoints, каждая из которых может быть больше байта (до четырех например в utf8). Если вы разрежете строку посреди codepoint, обе половины уже не будут строками или, в лучшем случае, будут битыми строками. Отображение это вообще отдельная тема, там не только codepoints действуют, композиция включается, а еще куча параметров конкретного шрифта. Знание кодировки нужно для любых действий со строкой, отличных от простого копирования. Это если говорить о строках, а не о кучке мусора с приделанным ноликом. Прежде чем пояснять, стоит все же хоть немного тему изучить.
Николай Камынин написал: текст в любой кодировке - это массив байт
Вообще все в компьютере это массив байт. Остальное все неверно. Ноль в конце это чисто сишная фишка, в паскале их нет например. Строка это не байты, а codepoints, каждая из которых может быть больше байта (до четырех например в utf8). Если вы разрежете строку посреди codepoint, обе половины уже не будут строками или, в лучшем случае, будут битыми строками. Отображение это вообще отдельная тема, там не только codepoints действуют, композиция включается, а еще куча параметров конкретного шрифта. Знание кодировки нужно для любых действий со строкой, отличных от простого копирования. Это если говорить о строках, а не о кучке мусора с приделанным ноликом. Прежде чем пояснять, стоит все же хоть немного тему изучить.
ну почитайте хотя бы документацию: цитата: ------------------------------------ lua_tolstring[-0, +0, e]const char *lua_tolstring (lua_State *L, int index, size_t *len);Конвертирует Lua значение по заданному индексу в C строку. Если len не является NULL, она также устанавливает указатель *len с длиной строки. Lua значение должно быть строкой или числом; в противном случае функция возвращает NULL. Если значение является числом, то lua_tolstring также изменяет действительное значение в стеке на строку. (Такое изменение дезориентирует функцию lua_next, когда lua_tolstring применяется для ключей во время обхода таблицы.)
lua_tolstring возвращает полностью согласованный, внутри Lua состояния, указатель на строку. В этой строке всегда имеется нуль ('\0'), после последнего символа (как в C).
Николай Камынин, вы выдергиваете особенность реализации и позиционируете ее как отличительный признак строки вообще. Луа добавляет ноль чисто для удобства и даже можно сказать чисто технически, потому что есть lua_pushlstring, принимающая размер, и вы можете сделать так
Если бы луа не добалял ноль, то в следующем вызове
Код
const char * pstr = lua_tostring(s, -1);
вы бы получили "hell" без нуля на конце и крэшнули бы приложение, пытаясь работать с ним сишными функциями. Именно поэтому луа ноль и добавляет, чтобы всегда возвращать терминированную строку. А теперь следите за руками. В сях я пишу
и внезапно получаю (широкую!) строку "HELLODOLLY". То есть луа не только сохранил строки в utf-16 и потом правильно вернул, но и правильно их склеил даже. Почему? А потому что плевал он на нолики в конце. У него есть сохраненная длина строки и по ней он ориентируется. Для сравнения сишный strcat (который по ноликам ориентируется) на таких строках сфейлит, вернет "HD", потому что тут после каждого байта ноль идет. Все это к чему. К тому, что в луа строки это тупо мусор заданной длины (даже без нолика), никакой семантики луа им не придает. А где должен бы придавать, там фейлит. Например, если я эту строчку "DOLLY" сделаю ключом в таблице (из сей), луа это слопает на ура. Но вот из самого луа я этого ключа не увижу (через перебор всех ключей только), потому что кодировка не совпадает. О чем и говорил выше, любая именно строковая операция кроме копирования требует знания кодировки. Как только нужна семантика, тут луа умывает руки.
Возникла проблема. Нас C написал библиотеку DLL. В ней функция для вызова из скрипта Lua. Библиотека подгружается, функция вызывается и нормально работает. Эта функция создаёт окна в отдельных потоках Windows, окна выводят cтроковую информацию API функциями Windоows(OutputDebugString, MessageBox), которые естественно корректно выводят русский текст при работе в простом приложении, но в DLL они выдают полную хрень из-за разных кодировок в среде Windows по умолчанию и в QUIK. Пробовал перед вызовом функций устанавливать локали по умолчанию через GetUserDefaultLocaleName и GetSystemDefaultLocaleName(обе возвращают "ru-Ru", а QUIK через _wsetlocale(LC_ALL, NULL) даёт локаль "C"), а потом вызывать функции вывода информации, после чего обратно возвращал локаль "C", чтобы QUIK работал не замечая временную смену локали. Не помогло!!! Как можно ещё выкрутиться? Изначально указать компилятору как-то(как?) закодить русский текст в кодировке QUIK-а? Писать строки через "\код" - не вариант, да и коды надо как-то генерить в кодировке QUIK-а. Пока что-то совсем на ум ничего не идёт.