PowerShell เริ่มต้นให้เปล่ง UTF-8 แทนที่จะเป็น UTF-16


31

ตามค่าเริ่มต้น PowerShell ใน Windows ดูเหมือนว่าจะแสดงผล UTF-16 (เช่นถ้าฉันทำอย่างง่ายecho hello > hi.txtแล้วhi.txtจะสิ้นสุดใน UTF-16) ฉันรู้ว่าฉันสามารถบังคับให้การเข้ารหัสข้อความที่ฉันต้องการโดยทำแทนecho hello | out-file -encoding utf8 hi.txtแต่สิ่งที่ฉันต้องการคือการที่จะเป็นค่าเริ่มต้นเมื่อฉันใช้ตัวดำเนินการเปลี่ยนเส้นทาง มีวิธีใดบ้างที่จะบรรลุเป้าหมายนี้?


1
ขอบคุณสำหรับเคล็ดลับสำหรับทางเลือกการทำสิ่งนี้จากเทอร์มินัลอาจเร็วกว่าโปรแกรมแก้ไขข้อความในบางครั้ง
ทอดด์นกกระทา

ใน Powershell 6.0 สิ่งนี้ถูกเรนเดอร์โดยไม่จำเป็นตอนนี้ Powershell เริ่มต้นที่ UTF-8 โดยไม่ต้องเข้ารหัสเพื่อเปลี่ยนเส้นทาง ดูgithub.com/PowerShell/PowerShell/issues/4878
kumarharsh

คำตอบ:


21

การใช้ตัวถอดรหัส. NET ในแอสเซมบลี System.Management.Automation (aka "Microsoft Windows PowerShell Engine Core แอสเซมบลี") เปิดเผยส่วนรหัสนี้:

// class: System.Management.Automation.RedirectionNode
private PipelineProcessor BuildRedirectionPipeline(string path, ExecutionContext context)
{
    CommandProcessorBase commandProcessorBase = context.CreateCommand("out-file");
    commandProcessorBase.AddParameter("-encoding", "unicode");
    if (this.Appending)
    {
        commandProcessorBase.AddParameter("-append", true);
    }
    commandProcessorBase.AddParameter("-filepath", path);
    ...

ดังนั้นมันจึงดูยากสำหรับฉัน

ในปีนี้เป็นใน Windows 7 Enterprise x64 ระบบที่ติดตั้ง PowerShell 2.0


5
ยังมีการเข้ารหัสอย่างหนักใน PowerShell 5 บน Windows 10 แต่น่าเสียดายที่:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel

3

ไม่แน่ใจว่าจะทำสิ่งที่คุณต้องการหรือไม่ แต่คุณสามารถลองตั้งค่าตัวแปรสภาพแวดล้อมตามที่กล่าวไว้ที่นี่

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

2
ฉันไม่คิดว่า$OutputEncodingเป็นสิ่งที่ฉันต้องการ ที่ถูกตั้งค่าเป็น ASCII ใน PowerShell และส่งผลต่อวิธีการแสดงสิ่งต่างๆ สิ่งที่ฉันต้องการจะทำคือการเปลี่ยนรูปแบบของข้อความที่บันทึกไว้ในไฟล์ซึ่ง (AFAICT) แตกต่างจาก$OutputEncodingตัวควบคุมใด
Benjamin Pollack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.