Гость
Форумы / Windows [игнор отключен] [закрыт для гостей] / PowerShell - работа кодировкой / 5 сообщений из 5, страница 1 из 1
29.01.2021, 10:05
    #40039822
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа кодировкой
Добрый день!
Вопрос по Windows PowerShell:

На моем локальном компьютере
Код: 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, 13:29
    #40039887
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа кодировкой
Lisichkin,


https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.default?view=netframework-4.8

Encoding.Default Property

Namespace:
System.Text
Assembly:
mscorlib.dll

Gets the default encoding for this .NET implementation.

Remarks
Код: html
1.
2.
3.
4.
5.
6.
7.
 Warning
Different computers can use different encodings as the default, and the default encoding can change on a single computer.
 If you use the Default encoding to encode and decode data streamed between computers or retrieved at different times on the same computer, it may translate that data incorrectly.
 In addition, the encoding returned by the Default property uses best-fit fallback to map unsupported characters to characters supported by the code page.
 For these reasons, using the default encoding is not recommended.
 To ensure that encoded bytes are decoded properly, you should use a Unicode encoding, such as UTF8Encoding or UnicodeEncoding.
 You could also use a higher-level protocol to ensure that the same format is used for encoding and decoding.
...
Рейтинг: 0 / 0
29.01.2021, 17:09
    #40039959
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа кодировкой
Становиться интересней.
У меня локально файл лежит в кодировке - UTF8.
На удаленном сервере Bamboo создает файл в виртуальной машине в ASCII

Код:
Код: 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.
39.
function Get-FileEncoding {
    [CmdletBinding()]
    param (
        [Alias("PSPath")]
        [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName = $True)]
        [String]$Path,

        [Parameter(Mandatory = $False)]
        [System.Text.Encoding]$DefaultEncoding = [System.Text.Encoding]::ASCII
    )

    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.ASCIIEncoding
...
Рейтинг: 0 / 0
29.01.2021, 17:40
    #40039969
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа кодировкой
Lisichkin
У меня локально файл лежит в кодировке - UTF8.
На удаленном сервере Bamboo создает файл в виртуальной машине в ASCII
ASCII, внезапно, целиком и полностью помещается в UTF8. Более того, они побитово совпадают. Если, конечно, это действительно US-ASCII, а не странное восьмибитное нечто.
...
Рейтинг: 0 / 0
29.01.2021, 17:47
    #40039973
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PowerShell - работа кодировкой
Переписал код так:

Код: 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.
39.
40.
41.
<# 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
  Add-Type -AssemblyName System.Web
  $JiraResolvedIssueStatusName=[System.Web.HttpUtility]::UrlEncode("Решен", $SelfEncoding)
  $JiraTestedIssueStatusName=[System.Web.HttpUtility]::UrlEncode("Оттестирован", $SelfEncoding)
  $JiraTestingIssueTypeName=[System.Web.HttpUtility]::UrlEncode("Тестирование", $SelfEncoding)



Локально работает. Надеюсь удаленно тоже
...
Рейтинг: 0 / 0
Форумы / Windows [игнор отключен] [закрыт для гостей] / PowerShell - работа кодировкой / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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