Thay đổi mã hóa đầu ra mặc định của PowerShell thành UTF-8

107
rwallace 2016-10-18 16:54.

Theo mặc định, khi bạn chuyển hướng đầu ra của một lệnh tới một tệp hoặc chuyển nó vào một thứ khác trong PowerShell, mã hóa là UTF-16, điều này không hữu ích. Tôi đang tìm cách đổi nó thành UTF-8.

Nó có thể được thực hiện trong từng trường hợp cụ thể bằng cách thay thế >foo.txtcú pháp bằng | out-file foo.txt -encoding utf8nhưng điều này rất khó xử khi phải lặp lại mỗi lần.

Cách bền bỉ để thiết lập mọi thứ trong PowerShell là đặt chúng vào \Users\me\Documents\WindowsPowerShell\profile.ps1; Tôi đã xác minh rằng tệp này thực sự được thực thi khi khởi động.

Người ta nói rằng có thể đặt mã hóa đầu ra $PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}nhưng tôi đã thử điều này và nó không có tác dụng.

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/ mà nói về $OutputEncodingvẻ bề ngoài thoạt nhìn như thể nó phải có liên quan, nhưng sau đó nó nói về sản lượng được mã hóa trong ASCII, đó không phải là những gì đang thực sự xảy ra.

Làm cách nào để bạn đặt PowerShell sử dụng UTF-8?

2 answers

166
mklement0 2016-10-18 17:12.

Lưu ý: Điều sau áp dụng cho Windows PowerShell .
Xem phần tiếp theo về phiên bản PowerShell Core (v6 +) đa nền tảng .

  • Trên PSv5.1 trở lên , ở đâu >và thực sự >>là bí danh Out-File, bạn có thể đặt mã hóa mặc định cho >/ >>/ Out-Filethông qua $PSDefaultParameterValuesbiến tùy chọn :

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • Trên PSv5.0 hoặc bên dưới , bạn không thể thay đổi mã hóa cho >/>> , nhưng, trên PSv3 hoặc cao hơn , các kỹ thuật nói trên làm việc cho các cuộc gọi rõ ràng đểOut-File .
    (Biến $PSDefaultParameterValuestùy chọn đã được giới thiệu trong PSv3.0).

  • Trên PSv3.0 trở lên , nếu bạn muốn đặt mã hóa mặc định cho tất cả các lệnh ghép ngắn hỗ trợ
    một -Encodingtham số
    (trong PSv5.1 + bao gồm >>>), hãy sử dụng:

    • $PSDefaultParameterValues['*:Encoding'] = 'utf8'

Nếu bạn đặt lệnh này trong của bạn$PROFILE , các lệnh ghép ngắn chẳng hạn như Out-FileSet-Content sẽ sử dụng mã hóa UTF-8 theo mặc định, nhưng lưu ý rằng điều này làm cho nó trở thành cài đặt toàn cầu phiên sẽ ảnh hưởng đến tất cả các lệnh / tập lệnh không chỉ định rõ ràng một mã hóa.

Tương tự, hãy đảm bảo bao gồm các lệnh như vậy trong các tập lệnh hoặc mô-đun mà bạn muốn hoạt động theo cùng một cách , để chúng thực sự hoạt động giống nhau ngay cả khi được chạy bởi người dùng khác hoặc một máy khác.

Lưu ý : ** PowerShell, kể từ v5.1, luôn tạo tệp UTF-8 _ với BOM (giả) _ ** , điều này thường chỉ xảy ra trong thế giới Windows - Các tiện ích dựa trên Unix không nhận dạng BOM này (xem phần dưới); xem bài đăng này để biết các giải pháp thay thế tạo tệp UTF-8 không có BOM.

Để biết tóm tắt về hành vi mã hóa ký tự mặc định hoàn toàn không nhất quán trên nhiều lệnh ghép ngắn chuẩn của Windows PowerShell , hãy xem phần dưới cùng.


Tự động $OutputEncodingbiến là không liên quan , và chỉ áp dụng cho cách PowerShell giao tiếp với chương trình bên ngoài (những gì mã hóa sử dụng PowerShell khi gửi chuỗi cho họ) - nó không có gì để làm với mã hóa mà các nhà khai thác chuyển hướng đầu ra và PowerShell cmdlets sử dụng để lưu vào tập tin.


Đọc tùy chọn: Quan điểm đa nền tảng: PowerShell Core :

PowerShell hiện là nền tảng đa nền tảng , thông qua phiên bản PowerShell Core , có mã hóa - hợp lý - được mặc định thành UTF-8 không có BOM , phù hợp với các nền tảng giống Unix.

  • Điều này có nghĩa là các tệp mã nguồn không có BOM được giả định là UTF-8 và sử dụng >/ Out-File/ Set-Contentmặc định là UTF-8 không có BOM ; Việc sử dụng utf8 -Encodingđối số một cách rõ ràng cũng tạo ra UTF-8 không có BOM, nhưng bạn có thể chọn tạo các tệp BOM giả với utf8bomgiá trị.

  • Nếu bạn tạo tập lệnh PowerShell bằng trình chỉnh sửa trên nền tảng giống Unix và ngày nay ngay cả trên Windows với trình chỉnh sửa đa nền tảng như Visual Studio Code và Sublime Text, thì *.ps1tệp kết quả thường sẽ không có BOM giả UTF-8:

    • Điều này hoạt động tốt trên PowerShell Core .
    • Nó có thể bị hỏng trên Windows PowerShell , nếu tệp chứa các ký tự không phải ASCII; nếu bạn cần sử dụng các ký tự không phải ASCII trong tập lệnh của mình, hãy lưu chúng dưới dạng UTF-8 với BOM .
      Không có BOM, Windows PowerShell (sai) diễn giải tập lệnh của bạn được mã hóa theo kiểu mã "ANSI" kế thừa (được xác định bởi ngôn ngữ hệ thống cho các ứng dụng trước Unicode; ví dụ: Windows-1252 trên hệ thống tiếng Anh-Mỹ).
  • Ngược lại, các file mà làm có UTF-8 pseudo-BOM thể được vấn đề trên Unix-như nền tảng, vì chúng gây ra các tiện ích Unix như cat, sedawk- và thậm chí một số biên tập viên như gedit- để vượt qua pseudo-HĐQT thông qua , tức là, để coi nó như là dữ liệu .

    • Điều này có thể không phải lúc nào cũng là một vấn đề, nhưng chắc chắn có thể xảy ra, chẳng hạn như khi bạn cố gắng đọc một tệp thành một chuỗi bashvới, chẳng hạn, text=$(cat file)hoặc text=$(<file)- biến kết quả sẽ chứa BOM giả dưới dạng 3 byte đầu tiên.

Hành vi mã hóa mặc định không nhất quán trong Windows PowerShell :

Rất tiếc, mã hóa ký tự mặc định được sử dụng trong Windows PowerShell hoàn toàn không nhất quán; phiên bản PowerShell Core đa nền tảng , như đã thảo luận trong phần trước, đã kết thúc tốt đẹp vấn đề này.

Ghi chú:

  • Phần sau không bao gồm tất cả các lệnh ghép ngắn chuẩn.

  • Các tên lệnh ghép ngắn trên Google để tìm chủ đề trợ giúp của chúng hiện hiển thị cho bạn phiên bản PowerShell Core của các chủ đề theo mặc định; sử dụng danh sách phiên bản thả xuống phía trên danh sách chủ đề ở bên trái để chuyển sang phiên bản Windows PowerShell .

  • Kể từ khi viết bài này, tài liệu thường tuyên bố không chính xác rằng ASCII là mã hóa mặc định trong Windows PowerShell - hãy xem sự cố tài liệu GitHub này .


Cmdlets viết :

Out-File>/ >>tạo "Unicode" - UTF-16LE - tệp theo mặc định - trong đó mỗi ký tự trong phạm vi ASCII (quá) được biểu thị bằng 2 byte - điều này đáng chú ý khác với Set-Content/ Add-Content(xem điểm tiếp theo); New-ModuleManifestExport-CliXmlcũng tạo tệp UTF-16LE.

Set-Content(và Add-Contentnếu tệp chưa tồn tại / trống) sử dụng mã hóa ANSI (mã hóa được chỉ định bởi trang mã kế thừa ANSI của ngôn ngữ hệ thống đang hoạt động, mà PowerShell gọi Default).

Export-Csvthực sự tạo ra các tệp ASCII, như được ghi lại, nhưng hãy xem các ghi chú -Appendbên dưới.

Export-PSSession tạo tệp UTF-8 với BOM theo mặc định.

New-Item -Type File -Value hiện đang tạo BOM-less (!) UTF-8.

Các Send-MailMessagechủ đề trợ giúp cũng tuyên bố rằng mã hóa ASCII là mặc định - Tôi đã không đích thân xác nhận rằng tuyên bố.

Start-Transcript luôn tạo tệp UTF-8 với BOM, nhưng hãy xem ghi chú -Appendbên dưới.

Lệnh Re nối vào một tệp hiện có:

>>/ Out-File -AppendLàm không cố gắng để phù hợp với mã hóa của một tập tin nội dung hiện có . Đó là, họ áp dụng mã hóa mặc định của mình một cách mù quáng, trừ khi được hướng dẫn khác với -Encoding, đây không phải là một tùy chọn với >>(ngoại trừ gián tiếp trong PSv5.1 +, qua $PSDefaultParameterValues, như được hiển thị ở trên). Tóm lại: bạn phải biết mã hóa nội dung của tệp hiện có và nối thêm bằng cách sử dụng cùng mã hóa đó.

Add-Contentlà ngoại lệ đáng khen ngợi: trong trường hợp không có -Encodingđối số rõ ràng , nó sẽ phát hiện mã hóa hiện có và tự động áp dụng nó cho nội dung mới. Cảm ơn, js2010 . Lưu ý rằng trong Windows PowerShell, điều này có nghĩa là mã hóa ANSI được áp dụng nếu nội dung hiện có không có BOM, trong khi đó là UTF-8 trong PowerShell Core.

Sự không nhất quán này giữa Out-File -Append/ >>Add-Content, cũng ảnh hưởng đến PowerShell Core , được thảo luận trong vấn đề GitHub này .

Export-Csv -Append khớp một phần với mã hóa hiện có: nó nối UTF-8 một cách mù quáng nếu mã hóa của tệp hiện có là bất kỳ ASCII / UTF-8 / ANSI nào, nhưng khớp chính xác UTF-16LE và UTF-16BE.
Nói cách khác: trong trường hợp không có BOM, Export-Csv -Appendgiả sử UTF-8 là, trong khi Add-Contentgiả định ANSI.

Start-Transcript -Append khớp một phần với mã hóa hiện có: Nó khớp chính xác các mã hóa với BOM , nhưng mặc định là mã hóa ASCII có khả năng mất dữ liệu nếu không có.


Cmdlets đọc (nghĩa là mã hóa được sử dụng trong trường hợp không có BOM ):

Get-ContentImport-PowerShellDataFilemặc định là ANSI ( Default), phù hợp với Set-Content.
ANSI cũng là những gì mà công cụ PowerShell tự mặc định khi nó đọc mã nguồn từ các tệp.

Ngược lại, Import-Csv, Import-CliXmlSelect-Stringgiả định UTF-8 trong sự vắng mặt của một BOM.

3
pbies 2020-05-25 05:17.

Nói ngắn gọn, hãy sử dụng:

write-output "your text" | out-file -append -encoding utf8 "filename"

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Desiree Rogers, trái, và Cheryl Mayberry McKissack Chuyển sang, Fenty Beauty và Pat McGrath, có một đế chế làm đẹp mới do phụ nữ làm chủ đang trỗi dậy. Sau thương vụ mua lại mỹ phẩm Black Opal vào tháng 9, đội ngũ quyền lực của Giám đốc điều hành công ty Desiree Rogers và Chủ tịch Cheryl Mayberry McKissack đã thông báo mua lại thương hiệu làm đẹp tiên phong Fashion Fair từ người sáng lập Johnson Publishing Company (JPC).

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Đối với những người có quá nhiều thời gian, tiệc tiết lộ giới tính là một cách thú vị để không cần áp đặt những định kiến ​​hạn chế lên thai nhi trước một đối tượng bạn bè giả vờ quan tâm một cách lịch sự. Tuy nhiên, việc chỉ dựa vào những chiếc bánh nướng có màu nhân tạo để biểu thị một tiếng hoo-ha hoặc một đứa trẻ đi tè đã trở nên xa xỉ trong các bậc cha mẹ trên Instagram.

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Hôm thứ Tư, cựu Bộ trưởng An ninh Nội địa Kirstjen Nielsen vì một lý do nào đó đã được đưa ra một diễn đàn để phát biểu tại Hội nghị thượng đỉnh Những người phụ nữ quyền lực nhất của Fortune. Và có thể đoán trước được, người phụ nữ giám sát các nỗ lực (đang diễn ra) của chính quyền Trump nhằm chia cắt các gia đình ở biên giới đã sử dụng thời gian của mình như một cơ hội để tự bảo vệ mình và tự nhận mình là người — và hãy hít thở sâu ở đây — “đã nói sự thật với quyền lực.

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Vì thế hệ mới nhất của chiếc xe điều chỉnh được yêu thích trên thế giới hiện đã có mặt tại đây, nên chỉ có điều kiện là Toyota Racing Development sẽ đưa phiên bản Supra thế hệ thứ năm sửa đổi của riêng mình đến SEMA vào tháng tới. Toyota đã cho chúng tôi một gợi ý về những gì sẽ xảy ra trong tuần này: một chiếc Concept GR Supra 3000GT hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language