Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ public enum TextEncodingType
/// </summary>
BigEndianUnicode,

/// <summary>
/// Big Endian UTF32 encoding.
/// </summary>
BigEndianUTF32,

/// <summary>
/// UTF8 encoding.
/// </summary>
Expand Down
5 changes: 4 additions & 1 deletion src/System.Management.Automation/utils/EncodingUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ internal static class EncodingConversion
internal const string String = "string";
internal const string Unicode = "unicode";
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";
Expand All @@ -25,13 +26,14 @@ internal static class EncodingConversion
internal const string Default = "default";
internal const string OEM = "oem";
internal static readonly string[] TabCompletionResults = {
Ascii, BigEndianUnicode, OEM, Unicode, Utf7, Utf8, Utf8Bom, Utf8NoBom, Utf32
Ascii, BigEndianUnicode, BigEndianUtf32, OEM, Unicode, Utf7, Utf8, Utf8Bom, Utf8NoBom, Utf32
};

internal static Dictionary<string, Encoding> encodingMap = new Dictionary<string, Encoding>(StringComparer.OrdinalIgnoreCase)
{
{ Ascii, System.Text.Encoding.ASCII },
{ BigEndianUnicode, System.Text.Encoding.BigEndianUnicode },
{ BigEndianUtf32, new UTF32Encoding(bigEndian: true, byteOrderMark: true) },
{ Default, ClrFacade.GetDefaultEncoding() },
{ OEM, ClrFacade.GetOEMEncoding() },
{ Unicode, System.Text.Encoding.Unicode },
Expand Down Expand Up @@ -116,6 +118,7 @@ internal sealed class ArgumentEncodingCompletionsAttribute : ArgumentCompletions
public ArgumentEncodingCompletionsAttribute() : base(
EncodingConversion.Ascii,
EncodingConversion.BigEndianUnicode,
EncodingConversion.BigEndianUtf32,
EncodingConversion.OEM,
EncodingConversion.Unicode,
EncodingConversion.Utf7,
Expand Down
56 changes: 23 additions & 33 deletions test/powershell/Language/Parser/RedirectionOperator.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -45,42 +45,32 @@ Describe "Redirection operator now supports encoding changes" -Tags "CI" {
}
}

# $availableEncodings = "unknown","string","unicode","bigendianunicode","utf8","utf7", "utf32","ascii","default","oem"
$availableEncodings = (Get-Command Out-File).Parameters["Encoding"].Attributes.ValidValues

$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) {
$skipTest = $false
if ($encoding -eq "default") {
# [System.Text.Encoding]::Default is exposed by 'System.Private.CoreLib.dll' at
# runtime via reflection. However,it isn't exposed in the reference contract of
# 'System.Text.Encoding', and therefore we cannot use 'Encoding.Default' in our
# code. So we need to skip this encoding in the test.
$skipTest = $true
}

# some of the encodings accepted by Out-File aren't real,
# and Out-File has its own translation, so we'll
# not do that logic here, but simply ignore those encodings
# as they eventually are translated to "real" encoding
$enc = [System.Text.Encoding]::$encoding
if ( $enc )
{
$msg = "Overriding encoding for Out-File is respected for $encoding"
$BOM = $enc.GetPreamble()
$TXT = $enc.GetBytes($asciiString)
$CR = $enc.GetBytes($asciiCR)
$expectedBytes = .{ $BOM; $TXT; $CR }
$PSDefaultParameterValues["Out-File:Encoding"] = "$encoding"
$asciiString > TESTDRIVE:/file.txt
$observedBytes = Get-Content -AsByteStream TESTDRIVE:/file.txt
# THE TEST
It $msg -Skip:$skipTest {
$observedBytes.Count | Should -Be $expectedBytes.Count
for($i = 0;$i -lt $observedBytes.Count; $i++) {
$observedBytes[$i] | Should -Be $expectedBytes[$i]
}
$encodingName = $encoding.EncodingName
$msg = "Overriding encoding for Out-File is respected for $encodingName"
$BOM = $encoding.GetPreamble()
$TXT = $encoding.GetBytes($asciiString)
$CR = $encoding.GetBytes($asciiCR)
$expectedBytes = @( $BOM; $TXT; $CR )
$PSDefaultParameterValues["Out-File:Encoding"] = $encoding
$asciiString > TESTDRIVE:/file.txt
$observedBytes = Get-Content -AsByteStream TESTDRIVE:/file.txt
# THE TEST
It $msg {
$observedBytes.Count | Should -Be $expectedBytes.Count
for($i = 0;$i -lt $observedBytes.Count; $i++) {
$observedBytes[$i] | Should -Be $expectedBytes[$i]
}

}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ Describe "Get-Content" -Tags "CI" {
@{EncodingName = 'String'},
@{EncodingName = 'Unicode'},
@{EncodingName = 'BigEndianUnicode'},
@{EncodingName = 'BigEndianUTF32'},
@{EncodingName = 'UTF8'},
@{EncodingName = 'UTF7'},
@{EncodingName = 'UTF32'},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,13 @@ public enum TestSByteEnum : sbyte {
Count = 1
ExpectedResult = "0000000000000000 00 68 00 65 00 6C 00 6C 00 6F h e l l o"
}
@{
Name = "Can process BigEndianUTF32 encoding 'fhx -InputObject 'hello' -Encoding BigEndianUTF32'"
Encoding = "BigEndianUTF32"
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