Что нового

Вывод русских букв из 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,570
Репутация
632
Автор
Belfigor

Belfigor

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

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

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

Вложения

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

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
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
Репутация
30
Alofa сказал(а):
Лично у меня ваш .INI вообще не читается.
Аналогично, создал другой ini-файл скопировал данные с этого - читается
 
Автор
Belfigor

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:
 
Автор
Belfigor

Belfigor

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