Added Support For Big Endian UTF-32
(#11947)
This commit is contained in:
parent
7837a536eb
commit
5f89a10f5b
|
@ -43,6 +43,11 @@ namespace Microsoft.PowerShell.Commands
|
||||||
/// </summary>
|
/// </summary>
|
||||||
BigEndianUnicode,
|
BigEndianUnicode,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Big Endian UTF32 encoding.
|
||||||
|
/// </summary>
|
||||||
|
BigEndianUTF32,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// UTF8 encoding.
|
/// UTF8 encoding.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -16,6 +16,7 @@ namespace System.Management.Automation
|
||||||
internal const string String = "string";
|
internal const string String = "string";
|
||||||
internal const string Unicode = "unicode";
|
internal const string Unicode = "unicode";
|
||||||
internal const string BigEndianUnicode = "bigendianunicode";
|
internal const string BigEndianUnicode = "bigendianunicode";
|
||||||
|
internal const string BigEndianUtf32 = "bigendianutf32";
|
||||||
internal const string Ascii = "ascii";
|
internal const string Ascii = "ascii";
|
||||||
internal const string Utf8 = "utf8";
|
internal const string Utf8 = "utf8";
|
||||||
internal const string Utf8NoBom = "utf8NoBOM";
|
internal const string Utf8NoBom = "utf8NoBOM";
|
||||||
|
@ -25,13 +26,14 @@ namespace System.Management.Automation
|
||||||
internal const string Default = "default";
|
internal const string Default = "default";
|
||||||
internal const string OEM = "oem";
|
internal const string OEM = "oem";
|
||||||
internal static readonly string[] TabCompletionResults = {
|
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)
|
internal static Dictionary<string, Encoding> encodingMap = new Dictionary<string, Encoding>(StringComparer.OrdinalIgnoreCase)
|
||||||
{
|
{
|
||||||
{ Ascii, System.Text.Encoding.ASCII },
|
{ Ascii, System.Text.Encoding.ASCII },
|
||||||
{ BigEndianUnicode, System.Text.Encoding.BigEndianUnicode },
|
{ BigEndianUnicode, System.Text.Encoding.BigEndianUnicode },
|
||||||
|
{ BigEndianUtf32, new UTF32Encoding(bigEndian: true, byteOrderMark: true) },
|
||||||
{ Default, ClrFacade.GetDefaultEncoding() },
|
{ Default, ClrFacade.GetDefaultEncoding() },
|
||||||
{ OEM, ClrFacade.GetOEMEncoding() },
|
{ OEM, ClrFacade.GetOEMEncoding() },
|
||||||
{ Unicode, System.Text.Encoding.Unicode },
|
{ Unicode, System.Text.Encoding.Unicode },
|
||||||
|
@ -116,6 +118,7 @@ namespace System.Management.Automation
|
||||||
public ArgumentEncodingCompletionsAttribute() : base(
|
public ArgumentEncodingCompletionsAttribute() : base(
|
||||||
EncodingConversion.Ascii,
|
EncodingConversion.Ascii,
|
||||||
EncodingConversion.BigEndianUnicode,
|
EncodingConversion.BigEndianUnicode,
|
||||||
|
EncodingConversion.BigEndianUtf32,
|
||||||
EncodingConversion.OEM,
|
EncodingConversion.OEM,
|
||||||
EncodingConversion.Unicode,
|
EncodingConversion.Unicode,
|
||||||
EncodingConversion.Utf7,
|
EncodingConversion.Utf7,
|
||||||
|
|
|
@ -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 =
|
||||||
$availableEncodings = (Get-Command Out-File).Parameters["Encoding"].Attributes.ValidValues
|
@([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) {
|
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,
|
$encodingName = $encoding.EncodingName
|
||||||
# and Out-File has its own translation, so we'll
|
$msg = "Overriding encoding for Out-File is respected for $encodingName"
|
||||||
# not do that logic here, but simply ignore those encodings
|
$BOM = $encoding.GetPreamble()
|
||||||
# as they eventually are translated to "real" encoding
|
$TXT = $encoding.GetBytes($asciiString)
|
||||||
$enc = [System.Text.Encoding]::$encoding
|
$CR = $encoding.GetBytes($asciiCR)
|
||||||
if ( $enc )
|
$expectedBytes = @( $BOM; $TXT; $CR )
|
||||||
{
|
$PSDefaultParameterValues["Out-File:Encoding"] = $encoding
|
||||||
$msg = "Overriding encoding for Out-File is respected for $encoding"
|
$asciiString > TESTDRIVE:/file.txt
|
||||||
$BOM = $enc.GetPreamble()
|
$observedBytes = Get-Content -AsByteStream TESTDRIVE:/file.txt
|
||||||
$TXT = $enc.GetBytes($asciiString)
|
# THE TEST
|
||||||
$CR = $enc.GetBytes($asciiCR)
|
It $msg {
|
||||||
$expectedBytes = .{ $BOM; $TXT; $CR }
|
$observedBytes.Count | Should -Be $expectedBytes.Count
|
||||||
$PSDefaultParameterValues["Out-File:Encoding"] = "$encoding"
|
for($i = 0;$i -lt $observedBytes.Count; $i++) {
|
||||||
$asciiString > TESTDRIVE:/file.txt
|
$observedBytes[$i] | Should -Be $expectedBytes[$i]
|
||||||
$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]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,6 +98,7 @@ Describe "Get-Content" -Tags "CI" {
|
||||||
@{EncodingName = 'OEM'},
|
@{EncodingName = 'OEM'},
|
||||||
@{EncodingName = 'Unicode'},
|
@{EncodingName = 'Unicode'},
|
||||||
@{EncodingName = 'BigEndianUnicode'},
|
@{EncodingName = 'BigEndianUnicode'},
|
||||||
|
@{EncodingName = 'BigEndianUTF32'},
|
||||||
@{EncodingName = 'UTF8'},
|
@{EncodingName = 'UTF8'},
|
||||||
@{EncodingName = 'UTF8BOM'},
|
@{EncodingName = 'UTF8BOM'},
|
||||||
@{EncodingName = 'UTF8NoBOM'},
|
@{EncodingName = 'UTF8NoBOM'},
|
||||||
|
|
|
@ -432,6 +432,13 @@ public enum TestSByteEnum : sbyte {
|
||||||
Count = 1
|
Count = 1
|
||||||
ExpectedResult = "0000000000000000 00 68 00 65 00 6C 00 6C 00 6F h e l l o"
|
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'"
|
Name = "Can process Unicode encoding 'fhx -InputObject 'hello' -Encoding Unicode'"
|
||||||
Encoding = "Unicode"
|
Encoding = "Unicode"
|
||||||
|
|
Loading…
Reference in a new issue