|
|
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток всем. В очередной раз прошу помощи с кодировкой строк - в этой теме я не очень силен. В двух словах проблема следующая. Есть у меня некий CMD-файл. Результат его работы при нормальном выполнении и выведении в файл выглядит вполне себе нормально, что-то типа такого: "C:\Work\Woken Space\Woken_DB>C:\Windows\SysWOW64\chcp.com 65001 Active code page: 65001 C:\Work\Woken Space\Woken_DB>Cr_Base.Cmd C:\OpenServer\modules\database\MySQL-8.0\bin\mysql.exe DBCreatorLocal Woken_DB C:\Work\Woken Space\Woken_DB>Rem ----- Создание базы ----- C:\Work\Woken Space\Woken_DB>C:\OpenServer\modules\database\MySQL-8.0\bin\mysql.exe --login-path=DBCreatorLocal -c 0<CreateDB.SQL 1>Logs\CreateDB.Log 2>&1 C:\Work\Woken Space\Woken_DB>Rem ----- Таблицы ----- C:\Work\Woken Space\Woken_DB>Rem ----- Настройки системы ----- C:\Work\Woken Space\Woken_DB>C:\OpenServer\modules\database\MySQL-8.0\bin\mysql.exe --login-path=DBCreatorLocal Woken_DB -c 0<Tables\tbSettings.SQL 1>Logs\tbSettings.Log 2>&1" Кодировка файла, как и заказывалась, UTF-8 (65001) Возникла у меня необходимость выполнения этого файла из своей программы и выведения этих результатов в собственную консоль. На текущий момент я испробовал два метода - функцию Execute из Jedi Code Library и компонент DosCommand. Библиотеки разные, поэтому с определенной долей уверенности можно говорить, что проблема не в них. Результат перехвата выглядит так: "C:\Work\Woken Space\Woken_DB>Cr_Base.Cmd C:\OpenServer\modules\database\MySQL-8.0\bin\mysql.exe DBCreatorLocal Woken_DB C:\Work\Woken Space\Woken_DB>Rem ----- ¦б¦-¦¬¦+¦-¦-¦¬¦¦ ¦-¦-¦¬TЛ ----- C:\Work\Woken Space\Woken_DB>C:\OpenServer\modules\database\MySQL-8.0\bin\mysql.exe --login-path=DBCreatorLocal -c 0<CreateDB.SQL 1>Logs\CreateDB.Log 2>&1 C:\Work\Woken Space\Woken_DB>Rem ----- ¦в¦-¦-¦¬¦¬TЖTЛ ----- C:\Work\Woken Space\Woken_DB>Rem ----- ¦Э¦-TБTВTА¦-¦¦¦¦¦¬ TБ¦¬TБTВ¦¦¦-TЛ ----- C:\Work\Woken Space\Woken_DB>C:\OpenServer\modules\database\MySQL-8.0\bin\mysql.exe --login-path=DBCreatorLocal Woken_DB -c 0<Tables\tbSettings.SQL 1>Logs\tbSettings.Log 2>&1" Кодировка сохраненного файла при отсутствии попыток перекодирования - 1252. Все русские строки, соответственно, попорчены. Мои неуклюжие попытки перекодирования результатов не дают. Отсюда вопрос: можно ли при получении перехваченной строки как-то преобразовать ее к нормальному виду или копать надо где-то в другом месте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 06:23 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gur Кодировка сохраненного файла при отсутствии попыток перекодирования - 1252. Все русские строки, соответственно, попорчены. Как именно сохраняется файл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 09:41 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
alekcvp, сейчас втупую в Lines TMemo добавляется каждая приходящая строка. В DosCommand Lines - это свойство компонента, он заполняет ее сам. В Jedi есть процедура, которая возвращает строки из консоли, я беру каждую строку и делаю TMemo.Lines.Add(). Пробовал определять кодировку каждой строки - строка без русских букв возвращает 0, с русскими - 1252. Memo.Lines.SaveToFile без явного указания кодировки создает файл в кодировке 1252 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 09:53 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gur, Ну ты же учитываешь, что в Lines.Add() добавляется string в UTF-16LE, а из приложения тебе приходит тупо набор байт в кодировке UTF-8? Вот где-то в этой цепочке данные и теряются. Попробуй сразу писать в файл то что приходит, через TFileStream.Write(), например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 10:38 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
alekcvp, проблема в том, что сейчас мне из приложения приходит не набор байт, а конкретно строка. Перевести ее в набор байт не проблема, но где гарантия, что этот набор байт будет тем же самым, из которого Jedi формирует строку для передачи ее в свой хэндлер? А DosCommand вообще не пускает меня в обработку - я передаю ему нужный Lines и он заполняет его сам. Jedi хотя бы возвращает каждую строку. Получается, что я не могу конвертнуть эту строку перед записью в Lines в нужную кодировку? А писать сразу в файл мне бессмысленно - тогда уж лучше сразу выполнять команду типа "1.CMD > tmpfile". Я вчера так пробовал - прекрасно работает. Но неинтересно это, некрасиво. Хотя как крайний вариант я это в голове держу... :-) P. S. У DosCommand есть 2 события - OnCharEncoding и OnCharDecoding. Параметр - буффер типа TStream. Но что с этим буфером делать - я пока не понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 10:45 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gur alekcvp, проблема в том, что сейчас мне из приложения приходит не набор байт, а конкретно строка. А DosCommand вообще не пускает меня в обработку - я передаю ему нужный Lines и он заполняет его сам. Ну тогда очевидно проблема в том, что все эти компоненты ничего не знают не то что про UTF8, а и даже про кириллицу. Выход вижу в написании всего этого дела самостоятельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 10:51 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gur, Можешь попробовать https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330938&msg=22235303 Там есть пример запуска cmd с ключём /U ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 11:51 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gurпроблема в том, что сейчас мне из приложения приходит не набор байт, а конкретно строка. Нет, из приложения-то тебе как раз приходит набор байт. А проблема в том, что ты не понимаешь, что его интерпретация - полностью на тебе. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 14:17 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gur, Кстати, а у тебя текст в cmd-файле в какой кодировке? Потому что команда chcp влияет только на отображение текста, а выводится он в той кодировке, в которой записан в cmdшнике. У тебя cmd-шник сам в UTF8 записан? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 14:54 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
alekcvp, UTF-8. 65001. И команда "1.CMD > 1.Log" тоже создает лог-файл в UTF-8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 15:18 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Воспользовался другой версией Jedi-вского Execute - она вместо работы с хэндлером возвращает полный текст вывода одним стрингом. Lines.Text := S1 дало тот же текст с кракозябрами. Однако конструкция Код: pascal 1. 2. 3. Дает прекрасный результат. Lines сохраняет файл в кодировке 65001. LoadFromFile без указания Encoding показывает текст с теми же кракозябрами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 16:16 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Проблема решена. Всем спасибо. Если кому интересно - хэндлер для Jedi-вского Execute: Код: pascal 1. 2. 3. 4. 5. 6. Кстати - опять же, если кому интересно - залитый из GetIt DosCommand имеет два обработчика - OnCharDecoding и OnCharEncoding. В процессе тестирования выяснилось, что OnCharEncoding просто нигде не вызывается и не обрабатывается. Забыли, наверное. Так что, для более интеллектуального (в смысле кодировок) использования он непригоден ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 16:30 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
С кодировками в консоли всё плохо... chcp только внутри cmd работает, для отрисовки на консоли, bat файл м.б. сохранён в любой кодировке, программы тоже могут выводить в любой (и вполне возможно - принудительно в ОЕМ, вне зависимости от внешних настроек), а еще есть WinAPI GetConsoleCP и GetConsoleOutputCP (отдельно на вход и выход!), которые не особо надежны, а для полного счастья есть еще и SetConsoleCP & SetConsoleOutputCP. Тоже сначала радостно решил перегнать все батчи в utf8, выставить кодировку консоли и забыть про ОЕМ как страшный сон. А вот хрен там. Ну то есть ECHO может и нормально сработает, а прикладные системные команды такого не умеют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2020, 17:05 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal С кодировками в консоли всё плохо... В Лазаре проблем нет. Там для винды есть WinCPToUTF8 (без относительно текущей кодовой страницы), в никсах - все давно уже в UTF8 (разве что гики выставят другую кодировку) S_Gur, Application.ProcessMessages - зло © ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2020, 17:13 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Док В Лазаре проблем нет. Там для винды есть WinCPToUTF8 (без относительно текущей кодовой страницы), В лазаре ровно те же проблемы. Они вообще ртл независмы. WinCPToUtf8 это для перевода системной анси-кодировки, той что CP_APC. Для консоли там ConsoleToUtf8, она предварительно делает конвертирование из Oem-кодировки в ansi, а потом в utf8. Но что ты будешь делать, когда тебе cmd отдаст utf16 вне зависимости от системных настроек... p.s. Прекращай пользоваться lazutf8, его выпилят - будешь переписывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2020, 18:13 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Док В Лазаре проблем нет Везде под винду есть, пока живы старые утилиты, да и винда еще сама никак не перейдет на юникод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2020, 20:10 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal да и винда еще сама никак не перейдет на юникод В десятке уже сделали utf-8 локаль. Пока, правда, бета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2020, 23:57 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey В десятке уже сделали utf-8 локаль. Пока, правда, бета. Вот и я о том же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2020, 02:04 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey WinCPToUtf8 это для перевода системной анси-кодировки, той что CP_APC. Для консоли там ConsoleToUtf8 Это теоретические познания или ты на практике проверял? У меня ConsoleToUtf8 как раз и не взлетела. По поводу lazutf8 - как только перейдут на UTF16 (имхо, перспектива ближайщих 3-5 лет, не раньше), так и будем думать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2020, 08:51 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Док Это теоретические познания или ты на практике проверял? Ты в код-то загляни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2020, 10:49 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gur В процессе тестирования выяснилось, что OnCharEncoding просто нигде не вызывается и не обрабатывается. Забыли, наверное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2020, 11:37 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
Кстати, если когда-нибудь ещё кому-то понадобится, вырезал из своего проекта и причесал, безо всяких дополнительных зависимостей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2020, 12:49 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2020, 18:59 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
alekcvp, отличный модуль. Большое спасибо. Я так понимаю, ты серьезно занимался подобными задачами. Тогда у меня сопутствующий вопрос: что в твоем понимании CommandLine? Только исполняемый файл или строка с параметрами выполнения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 22:34 |
|
||
|
Кодировка текста при перехвате консоли
|
|||
|---|---|---|---|
|
#18+
S_Gur, То же что и второй параметр в описании CreateProcess(). If lpApplicationName is NULL, the first white space–delimited token of the command line specifies the module name. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin. If the file name does not contain an extension, .exe is appended. Therefore, if the file name extension is .com, this parameter must include the .com extension. If the file name ends in a period (.) with no extension, or if the file name contains a path, .exe is not appended. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2020, 22:59 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40021232&tid=2037807]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
151ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 443ms |

| 0 / 0 |
