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

 
Ответить в эту темуОткрыть новую тему
> utf8 и clipboard
DarkMaster
сообщение 25.11.2022, 7:56
Сообщение #1


***********

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



Собственно нужно подгружать в буфер текст в utf8 с корявыми символами, затем как-то это вставить/напечатать. Нативные варианты проходить не захотели. Даже не очень понимаю куда при этом копать. То ли в луа пытаться юникод подключить, но какакая разница что там либы преобразуют, если я считваю файл в бинарном режиме("rb" флаги)? По идее там уже корректный юникод даже если луа или пилот о нем вообще ничего не знают. Кривой сам клибоард пилотовский? Открыл маны мсдн сделать биндинг, прихренел, прикрыл. Идеи? Реализации?
send/send217/say/sendex естественно не работают ибо пилот utf никогда и не знал. Что-то мне подсказывает, что в клипбоарде аналогичные проблемы.

Сообщение отредактировал DarkMaster - 25.11.2022, 8:11


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


********

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



utf8 на уровне api не поддерживается (нужен конверт в utf16 le).

Можно конвертить с определенной степенью работоспособности:

MultiByteToWideChar
WideCharToMultiByte

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

https://github.com/TakeAsh/cpp-WCTMB
https://github.com/ortfero/widechar
https://github.com/yoway030/WideCharToUnicodeTable

основной момент в том, что нельзя сконвертить кракозябры сразу в utf8. сначала нужно перегнать в utf16 и уже потом в utf8. в обратную сторону аналогично. на одно преобразование нужно 3-6 вызовов данного чуда.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.11.2022, 12:07
Сообщение #3


***********

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



Цитата

основной момент в том, что нельзя сконвертить кракозябры сразу в utf8.

Так в него и не надо. Файл уже в нем. Из этого файла нужно строки дергать в clipboard

Если тупо открыть блокнотом, то ctrl+c из файла и ctrl+v в софтину работают корректно.


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


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8459
Пользователь №: 19.451
Возраст: 32



А можно пример файла?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 25.11.2022, 12:43
Сообщение #5


********

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



Цитата(DarkMaster @ 25.11.2022, 12:07) *

Так в него и не надо. Файл уже в нем. Из этого файла нужно строки дергать в clipboard

Если тупо открыть блокнотом, то ctrl+c из файла и ctrl+v в софтину работают корректно.



Сути не меняет. Все равно нужно дергать системные функции. В ручном режиме работает потому что система под капотом точно также сконвертила.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.11.2022, 13:46
Сообщение #6


***********

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



образец.


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


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


***********

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



Я чет принципиально не очень понимаю зачем что-то конвертить. Есть файл, корректный файл. Мы его можем сохранить в чем угодно по кодировками. Есть io.open(path, "rb")
после этого у нас уже есть данные в корректной кодировке. Или я что-то не понимаю? Ну взял я сохранил файл в utf16 le. Подгрузил его бинарно. В памяти он уже utf16 le. Нет? Финт не прошел, но понимания пока не сильно больше, чем в начале. Не может ли сам пилот там ломать все? Вот это страшный вопрос. Особенно учитывая, что он при копированиии в буфер падал в обморок от открывающейся квадратной скобки...

Сообщение отредактировал DarkMaster - 25.11.2022, 13:58


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


********

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



io.open(path, "rb")

Это просто байты. Нет тут понятия кодировки. У меея нет понимания что ты хочешь сделать. Если просто туда обратно в буфер обмена то странно что не работает, если потом данные в окно идут то это закономерно что ломается.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.11.2022, 14:57
Сообщение #9


***********

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



Есть файл со спецсимволами и дурной локалью. Он в utf-8. Могу конвертнуть в utf16 le, если есть необходимость. Задача выдернуть из файла текс и вставить его в приложение. Приложение точно держит кодировки. Ну и вставка через ctrl+v идет так, что обработчики там уже виндовые. Вопрос в том, что в буфер не получается корректно поместить данные из файла, чтобы их потом вставить. На данный момент прилетают корректно только стандартные символы, остально крякозябрит.


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


********

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



Цитата(DarkMaster @ 25.11.2022, 14:57) *

Есть файл со спецсимволами и дурной локалью. Он в utf-8. Могу конвертнуть в utf16 le, если есть необходимость. Задача выдернуть из файла текс и вставить его в приложение. Приложение точно держит кодировки. Ну и вставка через ctrl+v идет так, что обработчики там уже виндовые. Вопрос в том, что в буфер не получается корректно поместить данные из файла, чтобы их потом вставить. На данный момент прилетают корректно только стандартные символы, остально крякозябрит.


если приложение древнее как и пилот, то

1) Конвертишь файл в utf-16 (MultiByteToWideChar)
2) Конвертишь из utf-16 в нужную локаль (WideCharToMultiByte, указывая кодовую страницу)
3) Копируешь в буфер обмена
4) Вставляешь

если приложение новое

1) Конвертишь в utf-16
2) Копируешь в буффер и вставляешь

Не совсем понятно что имеется в виду "приложение держит кодировки". Там либо полный юникод и как правило можно утф8 из коробки юзать, либо там ascii таблица и не все кодировки поддерживаются. Собственно, если в файле у тебя арабская вязь, то ты в любом случае не сможешь конвертнуть для показа в окошке ру-версии винды. Нужно ставить языковые пакеты или типа того, не помню точно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.11.2022, 16:38
Сообщение #11


***********

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



морда на хромиуме.

второй подход пробовал - не пошло. Поэтому и возникли вопросы а не пилот ли палки в колеса вставляет.


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


********

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



Пилот использует ascii версии апи, для этого и нужна конвертация. По факту тебе бы просто самому вызвать SetClipboardTextW() и все. А вставку норм сам хромиум отработает, т.к. он полностью юникодный. Но это лишь рассуждения, сам я так не делал ни разу.

Вот ее вызвать

https://learn.microsoft.com/en-us/windows/w...etclipboarddata

Теперь план такой:

1) читаешь файл
2) конвертишь в утф16 (почитай в доках умеет ли оно в утф8, тогда не надо)
3) вызываешь апи
4) эмулируешь вставку в хром
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.12.2022, 17:37
Сообщение #13


***********

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



В доках вроде utf16 вообще нет.
Решение собственно такое.
Дергаем:
winapi https://luapower.com/winapi/download
glue https://luapower.com/glue
events https://luapower.com/events (не уверен, что нужен под буфер, но в целом для кусков winapi он бывает нужен)
дабы не морочить голову у меня glue и events лежат прямо в папке winapi. Если хотите подгружать отдельно - правьте пути. Само winapi лежит в папке lua_plugins рядом с exe пилота.
Код

do
    local back = package.path
    package.path = "lua_plugins\\winapi\\?.lua;"..package.path
    setfenv(1, require'winapi')
    require[[winapi.clipboard]]
    package.path = back
end

OpenClipboard()
EmptyClipboard()
SetClipboardText("ВАШ ТЕКСТ")
CloseClipboard()

типа работает


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


********

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



Цитата
В доках вроде utf16 вообще нет.


в доках оно величаво зовется UNICODE
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.12.2022, 17:48
Сообщение #15


***********

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



а utf-8 это типа не юникод?)


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


********

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



Цитата(DarkMaster @ 2.12.2022, 17:48) *

а utf-8 это типа не юникод?)


Технически это конечно юникод, но для майкрософт юникод это utf16, utf8 - мультибайтовая кодировка
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 8.2.2023, 5:22
Сообщение #17


*****

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



Смотря на сколько сложная задача.
Можно было бы это реализовать с помощью различных ALT-кодов sendex @{num_1} Пилот не может набрать несколько цифр(нумпад). Но это не проблема, можно обойтись и обычными шорт кодами 1 2 которые браузеры или приложения конвертируют в символ(emoji) при получении сообщения. И в каждом отдельном ресурсе(вк, вайбер, андроид, айфон и т.п. сайт) могут быть свои кодировки, где-то поддерживаться где-то нет. Другое дело уже сгенерировать эти коды нужно создавать таблицу или же использовать конвертеры онлайн(по типу 1 или 2) или программы(консоли). Через буфер прогнать проблемы не должны возникать, а вот уже с обработкой или простым изменением уже нужно изменять(перегонять) кодировку.
:pensive:
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.2.2023, 12:21
Сообщение #18


***********

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



там дичь лютая была. я бы эти коды до пенсии делал)
Причем шуршит в т.ч. с ascii. Как оно там определяет я не шибко заморачивался. Вызов SetClipboardText иницирует выполнение ~50 строк в т.ч. с выделением памяти буфера, какие-то доп обертки луа и указание типов буфера. Хотел лог скинуть, но там ширина лютая оно слабо читаемое.


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

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

 

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