Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

-Encoding add ANSI option #19298

Merged
merged 5 commits into from
Mar 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 20 additions & 17 deletions src/System.Management.Automation/utils/EncodingUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT License.

using System.Collections.Generic;
using System.Globalization;
using System.Text;

using System.Management.Automation.Internal;
Expand All @@ -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 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 Utf8NoBom = "utf8NoBOM";
internal const string Utf8Bom = "utf8BOM";
internal const string Utf7 = "utf7";
internal const string Utf8NoBom = "utf8NoBOM";
internal const string Utf32 = "utf32";
internal const string Default = "default";
internal const string OEM = "oem";

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>
Expand All @@ -60,8 +63,7 @@ internal static Encoding Convert(Cmdlet cmdlet, string encoding)
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))
Expand Down Expand Up @@ -122,10 +124,10 @@ public override object Transform(EngineIntrinsics engineIntrinsics, object input
}
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;
Expand All @@ -138,6 +140,7 @@ public override object Transform(EngineIntrinsics engineIntrinsics, object input
internal sealed class ArgumentEncodingCompletionsAttribute : ArgumentCompletionsAttribute
{
public ArgumentEncodingCompletionsAttribute() : base(
EncodingConversion.ANSI,
EncodingConversion.Ascii,
EncodingConversion.BigEndianUnicode,
EncodingConversion.BigEndianUtf32,
Expand Down
4 changes: 2 additions & 2 deletions test/powershell/Language/Parser/RedirectionOperator.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@ 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)
[System.Text.Encoding]::Unicode
[System.Text.Encoding]::UTF7
[System.Text.Encoding]::UTF8
[System.Text.Encoding]::UTF32)

foreach($encoding in $availableEncodings) {

$encodingName = $encoding.EncodingName
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,8 @@ Describe "Get-Content" -Tags "CI" {
@{EncodingName = 'UTF8NoBOM'},
@{EncodingName = 'UTF7'},
@{EncodingName = 'UTF32'},
@{EncodingName = 'Ascii'}
@{EncodingName = 'Ascii'},
@{EncodingName = 'ANSI'}
){
param($EncodingName)

Expand All @@ -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

Expand Down Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down