ov3rwrite 26 Опубликовано: 18 ноября, 2020 Решил я вдруг написать дискорд-клиент на основе интернет карты, гуи библиотеки @Zer0Galaxy и json либы на гитхабе. Спустя долгое время разработки я понял, что совсем ничего не умею, а проблемы появились даже на стадии вывода. Вообщем я решил выложить сюда свои наработки, так как то, что уже написано работает нереально медленно и через раз, а сохранить и показать задумку хочется. Вкратце - это дискорд клиент, работающий на реквестах и без веб-сокетов(что и стало основной причиной того, что я это забросил), который умеет авторизовываться, выводить сервера, каналы и криво-косо выводить последнее сообщение в них Также возникла проблема с русскими символами, вместо них оно выводит Unicode Escape Sequence в виде "u0422u0435" Ссылку оставляю тут, делайте что хотите, надеюсь кто-нибудь поддержит задумку и я возьмусь за написание веб-сокетов https://pastebin.com/Zfn7YCqT Использовалось: https://gist.github.com/tylerneylon/59f4bcf316be525b30ab 1 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ZO125 11 Опубликовано: 19 ноября, 2020 (изменено) В 18.11.2020 в 20:49, ov3rwrite сказал: Также возникла проблема с русскими символами, вместо них оно выводит Unicode Escape Sequence в виде "u0422u0435" Я погонял прогу... Ну можешь написать костыль, который переведет это чудо в lua-number, а потом ручками в UTF 8. В любом случае код, который выплевывает твоя прога похож на русские буквы в юникоде с небольшими исключениями. Если мне не изменяет память чтобы перевести число после U в UTF 8 надо: 1) Перевести его в двоичный вид 2) Посчитать сколько байт тебе понадобится 3) Занести его туда по следующим правилам: 3.1) В первом байте начиная со старшего бита ввести столько единиц, сколько понадобится байт, завершив нулем, т.е 110 значит что символ двухбайтовый, а 11110 - четырехбайтовый. 3.2) Любой следующий байт начинается (1-старший бит) с 10 Просто вбить двоичный код полученный из числа в оставшиеся биты по порядку. Программа красиво выплевывает ошибку HTTP:400 при неправильных учетных данных ) Изменено 19 ноября, 2020 пользователем ZO125 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 904 Опубликовано: 19 ноября, 2020 В 18.11.2020 в 20:49, ov3rwrite сказал: Также возникла проблема с русскими символами, вместо них оно выводит Unicode Escape Sequence в виде "u0422u0435" Так а чо, пройдись регуляркой по этой стринге, и всё: str = "Meow u0422u0435" str = str:gsub("u(%d+)", function(code) return utf8.char(tonumber(code, 16)) end) -- Meow Te Если дискордыч всегда выдаёт 4 знака после "u", то разумнее будет воспользоваться паттерном "u(%d%d%d%d)" для более корректного декодирования ситуаций, когда после экранируемой последовательности следует обычная цифра, не входящая в неё. Например, "Meow u042215" (где 15 - просто текст) 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 20 ноября, 2020 11 час назад, ECS сказал: Так а чо, пройдись регуляркой по этой стринге, и всё: str = "Meow u0422u0435" str = str:gsub("u(%d+)", function(code) return utf8.char(tonumber(code, 16)) end) -- Meow Te Если дискордыч всегда выдаёт 4 знака после "u", то разумнее будет воспользоваться паттерном "u(%d%d%d%d)" для более корректного декодирования ситуаций, когда после экранируемой последовательности следует обычная цифра, не входящая в неё. Например, "Meow u042215" (где 15 - просто текст) Спасибо огромное, буду использовать. И да, оно увы выдает не только 4 цифры, иногда бывают и 3, аля u043 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 904 Опубликовано: 20 ноября, 2020 6 часов назад, ov3rwrite сказал: И да, оно увы выдает не только 4 цифры, иногда бывают и 3, аля u043 Вот уроды, а. Никакой стандартизации( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Avevad 15 Опубликовано: 20 ноября, 2020 21 час назад, ECS сказал: Так а чо, пройдись регуляркой по этой стринге, и всё: Банальный вопрос - а если придет сообщение без кириллицы, но с сочетанием буквы u и цифр? Кажется, должно приходить что-то еще, или же такие сочетания должны быть экранированы, так что не все так просто. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 904 Опубликовано: 20 ноября, 2020 1 час назад, Avevad сказал: Банальный вопрос - а если придет сообщение без кириллицы, но с сочетанием буквы u и цифр? Кажется, должно приходить что-то еще, или же такие сочетания должны быть экранированы, так что не все так просто. В том и проблема. Обычно подобные вещи экранируются редко встречающимися в повседневном общении комбинациями символов (по типу эмодзи 😀 у ВК). Тут вообще жесть какая-то. Мб у дискорда есть иные опции по экранированию юникода - эт уже вопрос к топикстартеру, ибо у него по ТЗ идет только uКод. Ну и ответ я дал соответственный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 20 ноября, 2020 2 часа назад, ECS сказал: В том и проблема. Обычно подобные вещи экранируются редко встречающимися в повседневном общении комбинациями символов (по типу эмодзи 😀 у ВК). Тут вообще жесть какая-то. Мб у дискорда есть иные опции по экранированию юникода - эт уже вопрос к топикстартеру, ибо у него по ТЗ идет только uКод. Ну и ответ я дал соответственный Нет, это вообще странно. Это не апи проблема, я с постмана чекал, там все ок. Это толи internet api чета крутит либо что то еще из OC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 904 Опубликовано: 20 ноября, 2020 2 часа назад, ov3rwrite сказал: Это толи internet api чета крутит либо что то еще из OC. О, это уже интересно. Наверняка json-либа при конвертации в луа-таблицу автоматом эскейпит символы, либо как-то по-своему обрезает экранированный результат от API. Если дело в ней, то сменить либу не будет проблемой. К примеру, с этой проблем не возникало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 21 ноября, 2020 11 час назад, ECS сказал: О, это уже интересно. Наверняка json-либа при конвертации в луа-таблицу автоматом эскейпит символы, либо как-то по-своему обрезает экранированный результат от API. Если дело в ней, то сменить либу не будет проблемой. К примеру, с этой проблем не возникало А черт его знает. Мб дело и правда в ней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 23 ноября, 2020 В 21.11.2020 в 02:01, ECS сказал: О, это уже интересно. Наверняка json-либа при конвертации в луа-таблицу автоматом эскейпит символы, либо как-то по-своему обрезает экранированный результат от API. Если дело в ней, то сменить либу не будет проблемой. К примеру, с этой проблем не возникало Нет, все таки с чем то еще беды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 904 Опубликовано: 23 ноября, 2020 3 часа назад, ov3rwrite сказал: Нет, все таки с чем то еще беды. С чем? Судя по скринам, парсинг абсолютно корректен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 23 ноября, 2020 8 минут назад, ECS сказал: С чем? Судя по скринам, парсинг абсолютно корректен Чем-то другим* Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 904 Опубликовано: 23 ноября, 2020 Проверил raw-ответ через сокет. API дискорда отдаёт сразу экранированные символы, либы опенкомпов тут ни при чём. Видимо, постман (как и ARC, кстати) сам их декодирует в русский эквивалент, из-за чего возникло подозрение на опенкомпы: Значит, решение с регуляркой остаётся верным. Или нужно модифицировать JSON-либу соответственным образом, но всё равно используя ручной декодинг Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 23 ноября, 2020 3 часа назад, ECS сказал: Проверил raw-ответ через сокет. API дискорда отдаёт сразу экранированные символы, либы опенкомпов тут ни при чём. Видимо, постман (как и ARC, кстати) сам их декодирует в русский эквивалент, из-за чего возникло подозрение на опенкомпы: Значит, решение с регуляркой остаётся верным. Или нужно модифицировать JSON-либу соответственным образом, но всё равно используя ручной декодинг Только я протестил и почему-то оно одну часть слова кодирует верно, а другую нет, хотя на том же Lua Demo оно работало прекрасно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 904 Опубликовано: 23 ноября, 2020 Пардон, мой косяк. Не указал, что в регулярке нужно юзать шестнадцатеричную систему: str:gsub("\\u([a-fA-F%d]+)", function(code) return unicode.char(tonumber(code, 16)) end) Проверил в кубаче, всё пашет: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 24 ноября, 2020 10 часов назад, ECS сказал: str:gsub("\\u([a-fA-F%d]+)", function(code) return unicode.char(tonumber(code, 16)) end) Если не ошибаюсь, существует шаблон для шестнадцатеричных символов - %x 2 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 24 ноября, 2020 2 часа назад, Zer0Galaxy сказал: Если не ошибаюсь, существует шаблон для шестнадцатеричных символов - %x Кстати, \u вроде добавили только в Lua 5.3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ov3rwrite Автор темы 26 Опубликовано: 24 ноября, 2020 13 часа назад, ECS сказал: Пардон, мой косяк. Не указал, что в регулярке нужно юзать шестнадцатеричную систему: str:gsub("\\u([a-fA-F%d]+)", function(code) return unicode.char(tonumber(code, 16)) end) Проверил в кубаче, всё пашет: Спасибо, надеюсь скоро возьмусь за проект, стоит ли тему новую создавать ради этого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 155 Опубликовано: 24 ноября, 2020 28 минут назад, ov3rwrite сказал: Спасибо, надеюсь скоро возьмусь за проект, стоит ли тему новую создавать ради этого? Ради чего? Если новая тема будет посвящена очередному этапу разработки, то нет, создавать новую тему не стоит. Если же в новая тема будет содержать описание готовой программы и ссылку на рабочий код, то это имеет смысл. Предлагаю пока что продолжить обсуждение в этой теме. А новую тему создать, когда уже появится что-то пригодное к использованию. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах