Что нового

Вывод русских букв из INI в CMD

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
Local $clients = IniReadSection('discovery.ini', 'discovery')
	Local $JSON
	$JSON &= '{'&@CRLF
	$JSON &= '	"data": ['&@CRLF
	For $i = 1 To $clients[0][0] Step 1
		$JSON &= '		{'&@CRLF	
		$JSON &= '			"{#'&'UTMIP'&'}": "'&$clients[$i][0]&'",'&@CRLF
		$JSON &= '			"{#'&'UTMALIAS'&'}": "'&$clients[$i][1]&'"'&@CRLF
		$JSON &= '		}'
		If $i <> $clients[0][0] Then 
			$JSON &= ','&@CRLF
		Else
			$JSON &= @CRLF
		EndIf
	Next
	$JSON &= '	]'&@CRLF
	$JSON &= '}'
	ConsoleWrite(_Encoding_ANSIToOEM($JSON))

Собственно вот такая функция. Считываю из INI значения и пытаюсь вывести их в CMD, но увы получается кракозябры. Пытался с помощью Encoding UDF _Encoding_ANSIToOEM, да и вообще ВСЕХ encoding функций что в ней есть, результат - кракозябры. Win10 Pro
Критически важно выводить данные в CMD именно на русском
UPD:
Приложение - консольное. Текст появляется как реакция на вызов программы с определенными параметрами.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Win 10 x64 Pro
код ниже выводит текст на русском без искажений
Код:
Local $inidata[2][2] = [[1,'Первый текст'],[2,'Второй текст']]
IniWriteSection(@ScriptDir & '\data.ini','com', $inidata, 0)
Local $rdini = IniReadSection(@ScriptDir & '\data.ini','com')
Run(@ComSpec & " /c " & $rdini[1][1], "", @SW_SHOW)
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Alofa, Приложил файл

joiner
Еще не добрался до компьютера, но таки этот способ вернет текст в то же окно cmd в котором будет осуществлен вызов моего консольного приложения с параметрами или же это будет просто отдельное всплывающее окно?

P.S. Приложение - консольное. Текст появляется как реакция на вызов программы с определенными параметрами.
 

Вложения

  • discovery.zip
    211 байт · Просмотры: 9

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Belfigor
ничего не понял, извини, но последний пост не очень на русском?
 
A

Alofa

Гость
Лично у меня ваш .INI вообще не читается.
Для себя давно уже сделал вывод - факт появления кракозябр зависит от нескольких составляющих:
- Настройки программы (под какую кодировку она заточена)
- Кодировка файла скрипта
- Кодировка источника текста.
Ваш файл в UTF-8, поменяйте на ANSI.
Код:
Local $JSON, $sINIFile = 'discovery.ini'
$sText = FileRead($sINIFile, 128)
FileDelete($sINIFile)
$hFile = FileOpen($sINIFile, 1 + 512) ; UTF16 LE - тоже ничего
FileWrite($hFile, $sText)
FileClose($hFile)

$clients = IniReadSection($sINIFile, 'discovery')
For $i = 1 To $clients[0][0] Step 1
	$JSON &= $clients[$i][0] & '=' & $clients[$i][1] & @CRLF
Next
ConsoleWrite($JSON)
Run(@ComSpec & ' /c echo ' & StringReplace($JSON, @CRLF, '&echo ') & '&pause')
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Alofa сказал(а):
Лично у меня ваш .INI вообще не читается.
Аналогично, создал другой ini-файл скопировал данные с этого - читается
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
По результатам отработки скрипта, стало получаться так
Код:
C:\ISN AutoIt Studio\Release\UTMMonitor>utmmonitor.exe discovery
{

        "data": [
C:\ISN AutoIt Studio\Release\UTMMonitor>                {
                        "{#UTMIP}": "10.189.173.11",
                        "{#UTMALIAS}": "Клиент 1"
                },
                {
                        "{#UTMIP}": "10.189.173.13",
                        "{#UTMALIAS}": "Клиент 22"
                },
                {
                        "{#UTMIP}": "10.189.173.14",
                        "{#UTMALIAS}": "Клиент 3"
                }
        ]
}

Проблема в том, что в середине массива данных появился нежелательный элемент
Код:
C:\ISN AutoIt Studio\Release\UTMMonitor>
, который бьет всю структуру данных массива, и после вывода сообщения, сама процедура вывода не прерывается (pause я убрал), курсор стоит в начале строки, и новую команду можно вводить только после отмены предыдущей команды, путем нажатия в cmd Ctrl+C. Можно как-то заставить предложенный вариант вывода
Код:
Run(@ComSpec & ' /c echo ' & StringReplace($JSON, @CRLF, '&echo '))
аналогично ConsoleWrite?
То есть например если открыть CMD и вбить туда команду "arp -a", то будет получен текстовый вывод, и командная строка будет готова к вводу следующей команды. В случае же с Run, в вывод добавляется инородный элемент данных, и CMD будет готово принимать следующую команду только после отмены предыдущей через Ctrl+C :(

UPD: Следующую команду можно вводить и без Ctrl+C. но без Ctrl+C не появится запись C:\ISN AutoIt Studio\Release\UTMMonitor> оповещающая о конце работы команды
 
A

Alofa

Гость
Belfigor сказал(а):
... Можно как-то заставить предложенный вариант...
Можно:
Код:
Local $JSON, $sINIFile = 'discovery.ini'

$clients = IniReadSection($sINIFile, 'discovery')
$JSON = '{&echo  "data": ['
For $i = 1 To $clients[0][0] Step 1
	$JSON &= '&echo      {' & _
			'&echo          "{#' & 'UTMIP' & '}": "' & $clients[$i][0] & '",' & _
			'&echo          "{#' & 'UTMALIAS' & '}": "' & $clients[$i][1] & '"' & _
			'&echo      }'
	If $i <> $clients[0][0] Then $JSON &= ','
Next
$JSON &= '&echo  ]' & _
		'&echo }'

Run(@ComSpec & ' /c echo ' & $JSON & '&pause')

Но у меня и так неплохо работает:
Код:
ConsoleWrite(_Encoding_ANSIToOEM($JSON))



Добавлено:
Сообщение автоматически объединено:

Belfigor сказал(а):
... в середине массива данных появился нежелательный элемент...
Как он там вообще мог появиться?
Может это такой "@error" у "ISN AutoIt Studio" :scratch:
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Таки оказалось что выше стоящее ПО вообще не умеет работать с кириллицей, и даже если вывести через CMD текст на русском, на следующем этапе он не будет распознан. Всем спасибо за помощь :smile:
 
Верх