Ad Widget

Collapse

Кириллица и json

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • xeonkeeper
    Junior Member
    • Sep 2012
    • 27

    #1

    Кириллица и json

    Получаю имя служб PS скриптом, в консоли сервера русские имена служб выводятся нормально, но выполняя этот скрипт через zabbix_get вся кириллица превращается в каракозябры, как победить?
  • Zentarim
    Senior Member
    • Mar 2012
    • 526

    #2
    Originally posted by xeonkeeper
    Получаю имя служб PS скриптом, в консоли сервера русские имена служб выводятся нормально, но выполняя этот скрипт через zabbix_get вся кириллица превращается в каракозябры, как победить?
    zabbix_get .... | iconv -fCP1251 -tUTF-8

    попробуйте

    Comment

    • xeonkeeper
      Junior Member
      • Sep 2012
      • 27

      #3
      Originally posted by zentarim
      zabbix_get .... | iconv -fcp1251 -tutf-8

      попробуйте
      попробовал, караказябры изменились на другие караказябры, вида "ЁбЇҐвзҐа **бва®©ЄЁ гбва®©бвў", "

      Comment

      • xeonkeeper
        Junior Member
        • Sep 2012
        • 27

        #4
        | iconv -f cp866 -t UTF-8


        Вот так получилось. Спасибо!

        Теперь вопрос, как мне это через UserParameter передать?
        UserParameter=service.discovery,powershell -File "C:\Program Files\zabbix\servicediscovery.ps1"
        Last edited by xeonkeeper; 02-06-2015, 17:11.

        Comment

        • yukra
          Senior Member
          • Apr 2013
          • 1359

          #5
          Originally posted by xeonkeeper
          | iconv -f cp866 -t UTF-8


          Вот так получилось. Спасибо!

          Теперь вопрос, как мне это через UserParameter передать?
          UserParameter=service.discovery,powershell -File "C:\Program Files\zabbix\servicediscovery.ps1"
          Code:
           UserParameter=service.discovery,powershell -File "C:\Program Files\zabbix\servicediscovery.ps1" |  iconv -f cp866 -t UTF-8
          или вызов iconv внутрь servicediscovery.ps1 упаковать

          Comment

          • xeonkeeper
            Junior Member
            • Sep 2012
            • 27

            #6
            Originally posted by yukra
            Code:
             UserParameter=service.discovery,powershell -File "C:\Program Files\zabbix\servicediscovery.ps1" |  iconv -f cp866 -t UTF-8
            или вызов iconv внутрь servicediscovery.ps1 упаковать
            первый способ не работает, пишет в консоли
            Code:
            "iconv" ▒▒ ▒▒▒▒ ▒▒▒▒७▒▒▒ ▒▒▒ ▒▒▒譥▒
            ▒▒▒▒▒▒▒▒, ▒ᯮ▒▒塞▒▒ ▒ணࠬ▒▒▒ ▒▒▒ ▒▒▒▒▒▒ 䠩▒▒▒.
            А второй это прописать iconv внутрь скрипта?

            Comment

            • xeonkeeper
              Junior Member
              • Sep 2012
              • 27

              #7
              В общем, чтобы было понятнее вот сам скрипт

              Code:
              $colItems = Get-WmiObject Win32_Service | where-object { $_.StartMode -ne 'Disabled' }
              
              Write-Host "{";
              write-host "`t ""data"":[";
              write-host
              
              
              $temp = 1
              
              
              foreach ($objItem in $colItems) {
               $exe_dir = $objItem.PathName
               $exe_dir = $exe_dir -replace '\s.*$',''
               $exe_dir = $exe_dir -replace '"?(.+\\).+exe.*$','$1'
               $exe_dir = $exe_dir -replace '\\','/'
               $exe_dir = $exe_dir -replace '"',''
               
               $desc_val = $objItem.Description
               #$desc_val = ” – ”
               $desc_val = $desc_val -replace '\"','@'
               
               if ($temp -eq 0){
              	Write-Host ",";
               } 
               else{
              	$temp = 0;
               }
               $line = " { `"{#SERVICESTATE}`":`"" + $objItem.State + "`", `"{#SERVICEDISPLAY}`":`"" + $objItem.DisplayName + "`", `"{#SERVICENAME}`":`"" + $objItem.Name + "`", `"{#SERVICEDESC}`":`"" + $desc_val + "`", `"{#SERVICEDIR}`":`"" + $exe_dir + "`" }"
               Write-Host -NoNewline $line
              }
              
              
              write-host
              write-host
              write-host "`t ]";
              write-host "}"

              Comment

              • BAKMAH
                Junior Member
                • Aug 2013
                • 6

                #8
                Code:
                function ConvertTo-Encoding ([string]$From, [string]$To){
                	Begin{
                		$encFrom = [System.Text.Encoding]::GetEncoding($from)
                		$encTo = [System.Text.Encoding]::GetEncoding($to)
                	}
                	Process{
                		$bytes = $encTo.GetBytes($_)
                		$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
                		$encTo.GetString($bytes)
                	}
                }
                и добавляем вызов функции например в эту строку
                Code:
                 $line = " { `"{#SERVICESTATE}`":`"" + $objItem.State + "`", `"{#SERVICEDISPLAY}`":`"" + $objItem.DisplayName + "`", `"{#SERVICENAME}`":`"" + $objItem.Name + "`", `"{#SERVICEDESC}`":`"" + $desc_val + "`", `"{#SERVICEDIR}`":`"" + $exe_dir + "`" }" | ConvertTo-Encoding "CP866" "UTF-8"

                Comment

                • yukra
                  Senior Member
                  • Apr 2013
                  • 1359

                  #9
                  Originally posted by xeonkeeper
                  первый способ не работает, пишет в консоли
                  Code:
                  "iconv" ▒▒ ▒▒▒▒ ▒▒▒▒७▒▒▒ ▒▒▒ ▒▒▒譥▒
                  ▒▒▒▒▒▒▒▒, ▒ᯮ▒▒塞▒▒ ▒ணࠬ▒▒▒ ▒▒▒ ▒▒▒▒▒▒ 䠩▒▒▒.
                  тык! Консоль у вас cp866, а вы выдаете utf8. Естественно что в консоли оно и не должно сработать, попробуйте значения через zabbix_get с сервера получить.

                  Comment

                  • xeonkeeper
                    Junior Member
                    • Sep 2012
                    • 27

                    #10
                    Originally posted by yukra
                    тык! Консоль у вас cp866, а вы выдаете utf8. Естественно что в консоли оно и не должно сработать, попробуйте значения через zabbix_get с сервера получить.
                    ну собственно, это и есть копипаст из zabbix_get

                    Comment

                    • xeonkeeper
                      Junior Member
                      • Sep 2012
                      • 27

                      #11
                      Originally posted by bakmah
                      Code:
                      function convertto-encoding ([string]$from, [string]$to){
                      	begin{
                      		$encfrom = [system.text.encoding]::getencoding($from)
                      		$encto = [system.text.encoding]::getencoding($to)
                      	}
                      	process{
                      		$bytes = $encto.getbytes($_)
                      		$bytes = [system.text.encoding]::convert($encfrom, $encto, $bytes)
                      		$encto.getstring($bytes)
                      	}
                      }
                      и добавляем вызов функции например в эту строку
                      Code:
                       $line = " { `"{#servicestate}`":`"" + $objitem.state + "`", `"{#servicedisplay}`":`"" + $objitem.displayname + "`", `"{#servicename}`":`"" + $objitem.name + "`", `"{#servicedesc}`":`"" + $desc_val + "`", `"{#servicedir}`":`"" + $exe_dir + "`" }" | convertto-encoding "cp866" "utf-8"
                      Спасибо! Работает!

                      Comment

                      • cardinal83
                        Junior Member
                        • Apr 2015
                        • 18

                        #12
                        Всем добрый день!
                        Тоже проблема с передачей кириллицы на Zabbix-сервер. Мой скрипт:

                        Code:
                        param(
                        	[Parameter(Mandatory=$False)]
                        	[string]$QueryName,
                        	[string]$CSV_NAME
                        )
                        
                        if ($QueryName -eq '') {
                            
                            $csvs = Get-Cluster | Get-ClusterSharedVolume
                        
                            write-host "{"
                            write-host " `"data`":["
                            write-host
                        
                            foreach ($csv in $csvs) {
                                if ($csv -ne $csvs[-1]) {
                                    $line =  " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" },"
                                    }
                                else {
                                    $line =  " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" }"
                                    }
                                write-host $line
                            }
                        
                            write-host
                            write-host " ]"
                            write-host "}"
                            write-host
                        }
                        
                        else {
                        
                            $csv = Get-Cluster | Get-ClusterSharedVolume | Where-Object {$_.Name -Match "$CSV_NAME"}
                            switch ($QueryName)
                                {
                        	('Status') {$Results = $CSV.State}
                        	('Owner') {$Results = $CSV.Node}
                        
                                default {$Results = "Incorrect Command Given"}
                                }
                            $Results = $Results | Out-String
                            $Results = $Results.trim()
                            Write-Host $Results
                        
                        }
                        В PS-консоли сервера выдает:

                        Code:
                        {
                         "data":[
                        
                         { "{#CSV_NAME}":"Диск кластера 2" },
                         { "{#CSV_NAME}":"Диск кластера 3" }
                        
                         ]
                        }
                        В консоли Zabbix-сервера результат zabbix-get в виде квадратиков вместо русских букв, причем количество квадратиков не совпадает с количеством русских букв.
                        Добавление вышеуказанной функции перекодировки в скрипт

                        Code:
                        param(
                        	[Parameter(Mandatory=$False)]
                        	[string]$QueryName,
                        	[string]$CSV_NAME
                        )
                        
                        function convertto-encoding ([string]$from, [string]$to){
                        	begin{
                        		$encfrom = [system.text.encoding]::getencoding($from)
                        		$encto = [system.text.encoding]::getencoding($to)
                        	}
                        	process{
                        		$bytes = $encto.getbytes($_)
                        		$bytes = [system.text.encoding]::convert($encfrom, $encto, $bytes)
                        		$encto.getstring($bytes)
                        	}
                        }
                        
                        if ($QueryName -eq '') {
                            
                            $csvs = Get-Cluster | Get-ClusterSharedVolume
                        
                            write-host "{"
                            write-host " `"data`":["
                            write-host
                        
                            foreach ($csv in $csvs) {
                                if ($csv -ne $csvs[-1]) {
                                    $line =  " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" }," | convertto-encoding "cp866" "utf-8"
                                    }
                                else {
                                    $line =  " { `"{#CSV_NAME}`":`"" + $CSV.Name + "`" }" | convertto-encoding "cp866" "utf-8"
                                    }
                                write-host $line
                            }
                        
                            write-host
                            write-host " ]"
                            write-host "}"
                            write-host
                        }
                        
                        else {
                        
                            $csv = Get-Cluster | Get-ClusterSharedVolume | Where-Object {$_.Name -Match "$CSV_NAME"}
                            switch ($QueryName)
                                {
                        	('Status') {$Results = $CSV.State}
                        	('Owner') {$Results = $CSV.Node}
                        
                                default {$Results = "Incorrect Command Given"}
                                }
                            $Results = $Results | Out-String
                            $Results = $Results.trim()
                            Write-Host $Results
                        
                        }
                        ломает вывод даже в консоли PS:

                        Code:
                        {
                         "data":[
                        
                         { "{#CSV_NAME}":"╨Ф╨╕╤Б╨║ ╨║╨╗╨░╤Б╤В╨╡╤А╨░ 2" },
                         { "{#CSV_NAME}":"╨Ф╨╕╤Б╨║ ╨║╨╗╨░╤Б╤В╨╡╤А╨░ 3" }
                        
                         ]
                        }
                        При этом результат вывода zabbix-get остается прежним, только количество квадратиков становится равным количеству русских букв.

                        Прошу помощи, уже всю голову сломал. Может я что-то где-то упустил.

                        ПС: сервер, откуда берутся данные, это Hyper-V Server 2012 R2 Rus.

                        Comment

                        • cardinal83
                          Junior Member
                          • Apr 2015
                          • 18

                          #13
                          Извиняюсь. Несмотря на то, что zabbix-get в консоли zabbix-сервера выводит квадратики, в БД значения попадают правильные, с русскими буквами, и все замечательно мониторится.

                          Comment

                          Working...