mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Make -Encoding parameter able to take ANSI encoding in PowerShell (#19298)
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user