Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Луа кириллица консоль.
DarkMaster
сообщение 13.9.2021, 7:07
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Столкнулся со странной проблемой кодировок в луа. Есть скрипт и в нем есть русский текст. Скрипт в 1251 кодировке. При попытке сделать print этого текста получаюстя иероглифы, дешифраторы кодировок определяют необходимую конвертацию dos -> 1251. На этот момент все предельно логично, файл 1251, cmd по умолчанию 866, получаем иероглифы. Меняю chcp на 1251, но получаю те же самые иероглифы. Абсолютно теже самые... визуально... По факту же кодировка у этих иероглифов уже не 866, а 1251. Т.е. по факту были взяты иероглифы, и им присвоены коды 1251. В итоге у меня:
трёа - вывод в кодировке 866
трёа - вывод в кодировке 1251
Символы одинаковые, кодировки разные. Что за бред и как победить?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 13.9.2021, 9:28
Сообщение #2


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1319
Пользователь №: 18.346
Возраст: 25



Эта проблема стара как сам виндовс.
Попробуй выполнить по инструкции https://habr.com/ru/sandbox/35290/
Либо нужно скачать из другого ресурса файл 1251 и заменить на корректный. Доберусь домой выложу архив.
Ps это способ работает только для корректного отображения кириллицы вместо крокозябр. Не работает если пилотом генерируется файл и сохраняется тогда нужно вручную через редактор ставить сперва текущая кодировка 1251 и затем преобразовать в utf
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 13.9.2021, 11:15
Сообщение #3


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1319
Пользователь №: 18.346
Возраст: 25



Попробовать использовать функцию setlocale с параметром ru https://www.gammon.com.au/scripts/doc.php?lua=os.setlocale
Либо перекодировать в 866 https://ru.stackoverflow.com/questions/6242...%BA%D0%BE%D0%BC
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 13.9.2021, 11:24
Сообщение #4


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26708
Пользователь №: 16.971
Возраст: 29



Сменить кодировку можно функциями CharToOemBuffA и OemToCharBuffA.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 13.9.2021, 12:04
Сообщение #5


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Эх, щас бы в 2021 кодировочки перегонять...utf-8 как-то принципиально не воспринимается.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 13.9.2021, 12:11
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата
Эх, щас бы в 2021 кодировочки перегонять...utf-8 как-то принципиально не воспринимается.

А ты думаешь там было иначе?) Я просто не стал про utf писать. Получаешь aaaaaaaaaaaa, меняешь chcp 65001 - получаешь aaaaaaaaaa, но уже в корректном юникоде. Легче точно не становится)

Utf кстати луа движком нативно не держится, там через либы, каждая из которых в чем-нибудь калеченая.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 13.9.2021, 14:01
Сообщение #7


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Ну вроде на такие случаи была придумана нормализация или типа того.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 13.9.2021, 19:57
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Установка локалей не помогла.

Цитата
CharToOemBuffA

Типа описать через ffi? И ковертить? Как бы двойную конвертацию не схватить, да и нужно ли это? По сути есть асинхрон локали консоли и луа, при этом непонятные действия луа по попыткам подстроиться под локаль консоли (насколько я понимаю происходящее).

Цитата
Ну вроде на такие случаи была придумана нормализация или типа того.

Можно поподробнее?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 13.9.2021, 21:53
Сообщение #9


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Цитата(DarkMaster @ 13.9.2021, 19:57) *

Можно поподробнее?



Не видя реальных данных сложно что-то сказать, вообще, думаю, что просто chcp маловато, ибо консоль винды достаточно капризная вещь, и нужно реально конвертировать данные через MultiByteToWide или наоборот, а то и то и то. А по поводу нормализации: https://habr.com/en/post/45489/

Но тут больше для экзотики, а не кириллицы.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 14.9.2021, 6:02
Сообщение #10


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Собственно "реальные" данные и батник которым стартую. Не исключаю, что заработает из коробки (когда-то решал проблемы с кодировками в какой-то хрени, назад не вернул, что делал забыл).

Сообщение отредактировал DarkMaster - 14.9.2021, 6:02


Прикрепленные файлы
Прикрепленный файл  test.zip ( 290 байт ) Кол-во скачиваний: 91


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 14.9.2021, 11:31
Сообщение #11


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



просто кодировки консоли менять не катит. Нужна конвертация.
MultiByteToWideChar

Причем это очень прожорливый вариант. Вызывать нужно не один раз.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 14.9.2021, 11:46
Сообщение #12


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26708
Пользователь №: 16.971
Возраст: 29



test.lua:
Код
local ffi = require("ffi")
ffi.cdef[[ bool CharToOemBuffA(const char* lpszSrc, char* lpszDst, unsigned long  cchDstLength); ]]
local text = "Вася"
local buf = ffi.new("char[?]", text:len()+1, text)
ffi.C.CharToOemBuffA(text, buf, text:len())
print(ffi.string(buf))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 14.9.2021, 15:35
Сообщение #13


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Я чет смотрю на весь этот изврат и думаю не проще ли формочку сделать =\


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 14.9.2021, 15:59
Сообщение #14


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21062
Пользователь №: 16.156



Цитата(DarkMaster @ 14.9.2021, 15:35) *

Я чет смотрю на весь этот изврат и думаю не проще ли формочку сделать =\


или перейти на питон, который стоит сейчас почти везде...
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 25.4.2024, 23:13
Designed by Nickostyle