Το βασικό πρόβλημα: κάθε εντολή με άλλη κωδικοποίηση
Στο Windows PowerShell 5.1 σχεδόν κάθε εντολή έχει τη δική της προεπιλογή: το Get-Content διαβάζει αρχεία χωρίς BOM ως ANSI (στα ελληνικά Windows Windows-1253), το Out-File και το > γράφουν UTF-16, το Set-Content γράφει ANSI και το Export-Csv ASCII. Το PowerShell 7 τα ενοποίησε και χρησιμοποιεί παντού UTF-8 χωρίς BOM.
Πριν
×ñÞóôçò;ÔìÞìá;Ðüëç ÃéÜííçò ÊùóôÜêçò;ÐùëÞóåéò;ÁèÞíá ÅëÝíç ÐáððÜ;ÁãïñÝò;ÐÜôñá
Μετά
Χρήστης;Τμήμα;Πόλη Γιάννης Κωστάκης;Πωλήσεις;Αθήνα Ελένη Παππά;Αγορές;Πάτρα
Σωστή ανάγνωση και εγγραφή αρχείων
- Το
Get-Content dedomena.csv -Encoding UTF8διαβάζει σωστά αρχεία UTF-8 ακόμη και χωρίς BOM. - Τα
Set-Content,Out-FileκαιAdd-Contentγράφουν UTF-8 με-Encoding UTF8– στο 5.1 πάντα με BOM. - Το
Export-Csv dedomena.csv -Encoding UTF8 -NoTypeInformationαντί για την προεπιλογή ASCII, που αντικαθιστά τα ελληνικά γράμματα με?. - Για όλες τις εντολές μαζί:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'στην αρχή του script. - Για παλιό αρχείο ελληνικού ANSI:
Get-Content palio.txt -Encoding Default(5.1) ή στο PowerShell 7-Encoding windows-1253.
Web αιτήματα με Invoke-RestMethod και Invoke-WebRequest
Αν ο διακομιστής δεν δηλώνει σύνολο χαρακτήρων στο Content-Type, το Windows PowerShell 5.1 αποκωδικοποιεί την απάντηση ως ISO-8859-1. Οι απαντήσεις UTF-8 περιέχουν τότε αβ αντί για αβ. Η λύση: πάρτε την απάντηση ως byte και αποκωδικοποιήστε την μόνοι σας, π.χ. με [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
Αρχεία script με ελληνικούς χαρακτήρες
Αν αποθηκεύσετε ένα script ως UTF-8 χωρίς BOM, το Windows PowerShell 5.1 το διαβάζει ως ANSI. Οι χαρακτήρες σε κείμενα όπως Write-Host 'Καλημέρα' εμφανίζονται τότε κατεστραμμένοι. Αποθηκεύστε τα .ps1 ως UTF-8 με BOM – στο VS Code από την κωδικοποίηση στη γραμμή κατάστασης, στο Notepad++ από το μενού Encoding → UTF-8-BOM.
Η κονσόλα
Αν μόνο το παράθυρο της κονσόλας δείχνει λάθος χαρακτήρες, το αρχείο είναι συχνά σωστό – η κονσόλα διαβάζει το UTF-8 ως DOS code page (στα ελληνικά Windows συνήθως 737) – περισσότερα για αυτό το μοτίβο. Αλλάξτε την έξοδο με [Console]::OutputEncoding = [Text.Encoding]::UTF8. Για έξοδο που περνά σε εξωτερικά προγράμματα ορίστε και $OutputEncoding = [Text.Encoding]::UTF8.
Αν το αρχείο έχει ήδη γραφτεί χαλασμένο, ρίξτε το στο πλαίσιο παραπάνω: το Mojibuster επισκευάζει τα αβ και τα συναφή και μετατρέπει αρχεία ANSI σε UTF-8, όπως περιγράφεται στο Μετατροπή Windows-1253 σε UTF-8. Αν το αρχείο περιέχει ήδη ερωτηματικά, το κείμενο έχει χαθεί.
Συχνές ερωτήσεις
Ποια έκδοση PowerShell έχω;
Το $PSVersionTable.PSVersion την εμφανίζει. Το 5.1 είναι το Windows PowerShell που περιλαμβάνεται στα Windows· από το 7 και μετά λέγεται απλώς PowerShell και χρησιμοποιεί εξ ορισμού UTF-8.
Γιατί το Excel ανοίγει λάθος το CSV μου από το PowerShell;
Το PowerShell 7 γράφει UTF-8 χωρίς BOM, που το Excel δεν αναγνωρίζει. Χρησιμοποιήστε -Encoding utf8BOM ή αποθηκεύστε το αρχείο με BOM στο Mojibuster. Περισσότερα στο Excel και ελληνικά.
Χρειάζομαι το chcp 65001;
Μόνο για προγράμματα που ακολουθούν το code page της κονσόλας. Μέσα στο PowerShell αρκεί το [Console]::OutputEncoding.