Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 PowerShell - работа с кодировкой  [new]
Lisichkin
Member

Откуда:
Сообщений: 479
Добрый день!
Вопрос по Windows PowerShell - предположу что это близко к .Net :)

На моем локальном компьютере
$Default = [System.Text.Encoding]::Default
echo "Default: $Default"

Выдает: System.Text.SBCSCodePageEncoding

$JiraResolvedIssueStatusName = [System.Web.HttpUtility]::UrlEncode("Решен", [System.Text.Encoding]::Default)
echo "JiraResolvedIssueStatusName=$JiraResolvedIssueStatusName"
$JiraResolvedIssueStatusName = [System.Web.HttpUtility]::UrlEncode("Решен", [System.Text.Encoding]::GetEncoding("utf-8"))
echo "JiraResolvedIssueStatusName=$JiraResolvedIssueStatusName"

Выдает:
JiraResolvedIssueStatusName=%d0%e5%f8%e5%ed
JiraResolvedIssueStatusName=%d0%a0%d0%b5%d1%88%d0%b5%d0%bd

Сервер Bamboo запускает Windows PowerShell на удаленной машине.
Результаты выполнения следующие:

System.Text.SBCSCodePageEncoding
JiraResolvedIssueStatusName=%d0%a0%d0%b5%d1%88%d0%b5%d0%bd
JiraResolvedIssueStatusName=%d0%a0%c2%a0%d0%a0%c2%b5%d0%a1%e2%82%ac%d0%a0%c2%b5%d0%a0%d0%85

Что мне нужно сделать на своей локальной машине, что бы результат совпадал с результатом удаленного сервера?

С Уважением,
Александр.
29 янв 21, 11:23    [22271106]     Ответить | Цитировать Сообщить модератору
 Re: PowerShell - работа с кодировкой  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145742
Lisichkin
$JiraResolvedIssueStatusName = [System.Web.HttpUtility]::UrlEncode("Решен", [System.Text.Encoding]::GetEncoding("utf-8"))


Кроме UTF-8 есть много других забавных кодировок

windows-1251
cp866

Проверьте работу с ними
29 янв 21, 22:10    [22271459]     Ответить | Цитировать Сообщить модератору
 Re: PowerShell - работа с кодировкой  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
Это ж литерал внутри файла скрипта. Нужно смотреть, в какой кодировке сам скрипт сохранен.
Но лучше так не делать, я думаю, если очень нужно литерал запихать в скрипт, то лучше его заэнкодить сразу. А с переменными такого эффекта, понятное дело, не будет.

Сообщение было отредактировано: 29 янв 21, 22:29
29 янв 21, 22:35    [22271464]     Ответить | Цитировать Сообщить модератору
 Re: PowerShell - работа с кодировкой  [new]
Lisichkin
Member

Откуда:
Сообщений: 479
Shocker.Pro,
Вы правы. Я не ожидал такого подвоха от скриптовых языков.
Следующий код, определяющий кодировку исполняемого скрипта:
<# Get file encoding #>
function Get-FileEncoding {
  [CmdletBinding()]
  param (
      [Alias("PSPath")]
      [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName = $True)]
      [String]$Path,
      [Parameter(Mandatory = $False)]
      [System.Text.Encoding]$DefaultEncoding = [System.Text.Encoding]::Default
  )

  process {
      [Byte[]]$bom = Get-Content -Encoding Byte -ReadCount 4 -TotalCount 4 -Path $Path
      $encoding_found = $false

      foreach ($encoding in [System.Text.Encoding]::GetEncodings().GetEncoding()) {
          $preamble = $encoding.GetPreamble()
          if ($preamble) {
              foreach ($i in 0..$preamble.Length) {
                  if ($preamble[$i] -ne $bom[$i]) {
                      break
                  } elseif ($i -eq $preable.Length) {
                      $encoding_found = $encoding
                  }
              }
          }
      }

      if (!$encoding_found) {
          $encoding_found = $DefaultEncoding
      }

      $encoding_found
  }
}

  $SelfEncoding = Get-FileEncoding $PSCommandPath
  echo "SelfEncoding=$SelfEncoding"


Возвращает:
Local: System.Text.UTF8Encoding
Bamboo: System.Text.SBCSCodePageEncoding (Win 1251)

Т.е. Bamboo создает агента в виртуальной Win OS и на нем файл скрипта в кодировке Win1251.
Мое решение - использовать переменную $SelfEncoding, содержащую кодировку текущего исполняемого скрипта.

Shocker.Pro
Но лучше так не делать, я думаю, если очень нужно литерал запихать в скрипт, то лучше его заэнкодить сразу
- Не совсем понятно как это делать?
30 янв 21, 11:29    [22271609]     Ответить | Цитировать Сообщить модератору
 Re: PowerShell - работа с кодировкой  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
Lisichkin
Не совсем понятно как это делать?
вместо
$JiraResolvedIssueStatusName = [System.Web.HttpUtility]::UrlEncode("Решен", [System.Text.Encoding]::Default)
напиши
$JiraResolvedIssueStatusName = "%d0%e5%f8%e5%ed"
30 янв 21, 12:32    [22271632]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить