Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / PowerShell - работа с кодировкой / 5 сообщений из 5, страница 1 из 1
29.01.2021, 11:23
    #40039844
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа с кодировкой
Добрый день!
Вопрос по Windows PowerShell - предположу что это близко к .Net :)

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


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

Код: powershell
1.
2.
3.
4.
$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

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

С Уважением,
Александр.
...
Рейтинг: 0 / 0
29.01.2021, 22:10
    #40040012
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа с кодировкой
Lisichkin
Код: powershell
1.
$JiraResolvedIssueStatusName = [System.Web.HttpUtility]::UrlEncode("Решен", [System.Text.Encoding]::GetEncoding("utf-8"))



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

windows-1251
cp866

Проверьте работу с ними
...
Рейтинг: 0 / 0
29.01.2021, 22:35
    #40040016
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа с кодировкой
Это ж литерал внутри файла скрипта. Нужно смотреть, в какой кодировке сам скрипт сохранен.
Но лучше так не делать, я думаю, если очень нужно литерал запихать в скрипт, то лучше его заэнкодить сразу. А с переменными такого эффекта, понятное дело, не будет.
...
Рейтинг: 0 / 0
30.01.2021, 11:29
    #40040066
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа с кодировкой
Shocker.Pro,
Вы правы. Я не ожидал такого подвоха от скриптовых языков.
Следующий код, определяющий кодировку исполняемого скрипта:
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<# 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 Но лучше так не делать, я думаю, если очень нужно литерал запихать в скрипт, то лучше его заэнкодить сразу - Не совсем понятно как это делать?
...
Рейтинг: 0 / 0
30.01.2021, 12:32
    #40040080
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа с кодировкой
Lisichkin
Не совсем понятно как это делать?
вместо
Код: powershell
1.
$JiraResolvedIssueStatusName = [System.Web.HttpUtility]::UrlEncode("Решен", [System.Text.Encoding]::Default)

напиши
Код: powershell
1.
$JiraResolvedIssueStatusName = "%d0%e5%f8%e5%ed"
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / PowerShell - работа с кодировкой / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]