Added Support For Big Endian UTF-32 (#11947)

This commit is contained in:
Bryan Berns 2020-04-07 17:33:15 -04:00 committed by GitHub
parent 7837a536eb
commit 5f89a10f5b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 40 additions and 34 deletions

View file

@ -43,6 +43,11 @@ namespace Microsoft.PowerShell.Commands
/// </summary>
BigEndianUnicode,
/// <summary>
/// Big Endian UTF32 encoding.
/// </summary>
BigEndianUTF32,
/// <summary>
/// UTF8 encoding.
/// </summary>

View file

@ -16,6 +16,7 @@ namespace System.Management.Automation
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";
@ -25,13 +26,14 @@ namespace System.Management.Automation
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 },
@ -116,6 +118,7 @@ namespace System.Management.Automation
public ArgumentEncodingCompletionsAttribute() : base(
EncodingConversion.Ascii,
EncodingConversion.BigEndianUnicode,
EncodingConversion.BigEndianUtf32,
EncodingConversion.OEM,
EncodingConversion.Unicode,
EncodingConversion.Utf7,

View file

@ -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]
}
}
}
}

View file

@ -98,6 +98,7 @@ Describe "Get-Content" -Tags "CI" {
@{EncodingName = 'OEM'},
@{EncodingName = 'Unicode'},
@{EncodingName = 'BigEndianUnicode'},
@{EncodingName = 'BigEndianUTF32'},
@{EncodingName = 'UTF8'},
@{EncodingName = 'UTF8BOM'},
@{EncodingName = 'UTF8NoBOM'},

View file

@ -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"