Make -Encoding parameter able to take ANSI encoding in PowerShell (#19298)

This commit is contained in:
CarloToso
2023-03-13 15:05:28 -07:00
committed by GitHub
parent cf93f01ea1
commit 9a2d2afb64
4 changed files with 28 additions and 24 deletions
@@ -2,6 +2,7 @@
// Licensed under the MIT License.
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Management.Automation.Internal;
@@ -10,41 +11,43 @@ namespace System.Management.Automation
{
internal static class EncodingConversion
{
internal const string Unknown = "unknown";
internal const string String = "string";
internal const string Unicode = "unicode";
internal const string ANSI = "ansi";
internal const string Ascii = "ascii";
internal const string BigEndianUnicode = "bigendianunicode";
internal const string BigEndianUtf32 = "bigendianutf32";
internal const string Ascii = "ascii";
internal const string Utf8 = "utf8";
internal const string Utf8NoBom = "utf8NoBOM";
internal const string Utf8Bom = "utf8BOM";
internal const string Utf7 = "utf7";
internal const string Utf32 = "utf32";
internal const string Default = "default";
internal const string OEM = "oem";
internal const string String = "string";
internal const string Unicode = "unicode";
internal const string Unknown = "unknown";
internal const string Utf7 = "utf7";
internal const string Utf8 = "utf8";
internal const string Utf8Bom = "utf8BOM";
internal const string Utf8NoBom = "utf8NoBOM";
internal const string Utf32 = "utf32";
internal static readonly string[] TabCompletionResults = {
Ascii, BigEndianUnicode, BigEndianUtf32, OEM, Unicode, Utf7, Utf8, Utf8Bom, Utf8NoBom, Utf32
ANSI, Ascii, BigEndianUnicode, BigEndianUtf32, OEM, Unicode, Utf7, Utf8, Utf8Bom, Utf8NoBom, Utf32
};
internal static readonly Dictionary<string, Encoding> encodingMap = new Dictionary<string, Encoding>(StringComparer.OrdinalIgnoreCase)
internal static readonly Dictionary<string, Encoding> encodingMap = new(StringComparer.OrdinalIgnoreCase)
{
{ ANSI, Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.ANSICodePage) },
{ Ascii, Encoding.ASCII },
{ BigEndianUnicode, Encoding.BigEndianUnicode },
{ BigEndianUtf32, new UTF32Encoding(bigEndian: true, byteOrderMark: true) },
{ Default, Encoding.Default },
{ OEM, ClrFacade.GetOEMEncoding() },
{ String, Encoding.Unicode },
{ Unicode, Encoding.Unicode },
{ Unknown, Encoding.Unicode },
#pragma warning disable SYSLIB0001
{ Utf7, Encoding.UTF7 },
#pragma warning restore SYSLIB0001
{ Utf8, Encoding.Default },
{ Utf8Bom, Encoding.UTF8 },
{ Utf8NoBom, Encoding.Default },
{ Utf32, Encoding.UTF32 },
{ String, Encoding.Unicode },
{ Unknown, Encoding.Unicode },
{ Utf32, Encoding.UTF32 },
};
/// <summary>
@@ -60,8 +63,7 @@ namespace System.Management.Automation
return Encoding.Default;
}
Encoding foundEncoding;
if (encodingMap.TryGetValue(encoding, out foundEncoding))
if (encodingMap.TryGetValue(encoding, out Encoding foundEncoding))
{
// Write a warning if using utf7 as it is obsolete in .NET5
if (string.Equals(encoding, Utf7, StringComparison.OrdinalIgnoreCase))
@@ -122,10 +124,10 @@ namespace System.Management.Automation
}
else
{
return System.Text.Encoding.GetEncoding(stringName);
return Encoding.GetEncoding(stringName);
}
case int intName:
return System.Text.Encoding.GetEncoding(intName);
return Encoding.GetEncoding(intName);
}
return inputData;
@@ -138,6 +140,7 @@ namespace System.Management.Automation
internal sealed class ArgumentEncodingCompletionsAttribute : ArgumentCompletionsAttribute
{
public ArgumentEncodingCompletionsAttribute() : base(
EncodingConversion.ANSI,
EncodingConversion.Ascii,
EncodingConversion.BigEndianUnicode,
EncodingConversion.BigEndianUtf32,
@@ -45,7 +45,7 @@ Describe "Redirection operator now supports encoding changes" -Tags "CI" {
}
}
$availableEncodings =
$availableEncodings =
@([System.Text.Encoding]::ASCII
[System.Text.Encoding]::BigEndianUnicode
[System.Text.UTF32Encoding]::new($true,$true)
@@ -53,7 +53,7 @@ Describe "Redirection operator now supports encoding changes" -Tags "CI" {
[System.Text.Encoding]::UTF7
[System.Text.Encoding]::UTF8
[System.Text.Encoding]::UTF32)
foreach($encoding in $availableEncodings) {
$encodingName = $encoding.EncodingName
@@ -104,7 +104,8 @@ Describe "Get-Content" -Tags "CI" {
@{EncodingName = 'UTF8NoBOM'},
@{EncodingName = 'UTF7'},
@{EncodingName = 'UTF32'},
@{EncodingName = 'Ascii'}
@{EncodingName = 'Ascii'},
@{EncodingName = 'ANSI'}
){
param($EncodingName)
@@ -114,7 +115,7 @@ Describe "Get-Content" -Tags "CI" {
@('𐍈1','𐍈𐍈2','𐍈𐍈𐍈3','𐍈𐍈𐍈𐍈4','𐍈𐍈𐍈𐍈𐍈5')) # utf-32
ForEach ($content in $contentSets)
{
$tailCount = 3
$tailCount = 4
$testPath = Join-Path -Path $TestDrive -ChildPath 'TailWithEncoding.txt'
$content | Set-Content -Path $testPath -Encoding $EncodingName
@@ -221,7 +222,7 @@ Describe "Get-Content" -Tags "CI" {
$expected = 'He', 'o,', '', 'Wor', "d${nl}He", 'o2,', '', 'Wor', "d2${nl}"
for ($i = 0; $i -lt $result.Length ; $i++) { $result[$i] | Should -BeExactly $expected[$i]}
}
Context "Alternate Data Stream support on Windows" {
It "Should support NTFS streams using colon syntax" -Skip:(!$IsWindows) {
Set-Content "${testPath}:Stream" -Value "Foo"
@@ -438,7 +438,7 @@ public enum TestSByteEnum : sbyte {
Count = 2
ExpectedResult = "0000000000000000 00 00 00 68 00 00 00 65 00 00 00 6C 00 00 00 6C h e l l"
ExpectedSecondResult = "0000000000000010 00 00 00 6F o"
}
}
@{
Name = "Can process Unicode encoding 'fhx -InputObject 'hello' -Encoding Unicode'"
Encoding = "Unicode"