Διόρθωση της κωδικοποίησης ελληνικών στο PowerShell

Το script σας γράφει ??? αντί για ελληνικά ή η κονσόλα δείχνει κατεστραμμένα γράμματα; Το Windows PowerShell 5.1 χρησιμοποιεί διαφορετική κωδικοποίηση ανάλογα με την εντολή. Εδώ θα βρείτε τις αιτίες και τις σωστές παραμέτρους – και μπορείτε να επισκευάσετε χαλασμένα αρχεία στον browser παραπάνω.

Λειτουργεί με κείμενο και με αυτά τα αρχεία:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Για παράδειγμα εξαγωγές από το Excel, αντίγραφα ασφαλείας βάσεων δεδομένων, υπότιτλοι και κώδικας ιστοσελίδων.

Διόρθωση

  1. Σύρετε ένα αρχείο ή επικολλήστε κείμενο
  2. Η διόρθωση γίνεται αυτόματα
  3. Αντιγράψτε ή κατεβάστε το αποτέλεσμα
ή σύρετε το αρχείο εδώ

Το βασικό πρόβλημα: κάθε εντολή με άλλη κωδικοποίηση

Στο 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.

Αρχείο Windows-1253 διαβασμένο λάθος

Πριν

×ñÞóôçò;ÔìÞìá;Ðüëç
ÃéÜííçò ÊùóôÜêçò;ÐùëÞóåéò;ÁèÞíá
ÅëÝíç ÐáððÜ;ÁãïñÝò;ÐÜôñá

Μετά

Χρήστης;Τμήμα;Πόλη
Γιάννης Κωστάκης;Πωλήσεις;Αθήνα
Ελένη Παππά;Αγορές;Πάτρα

Σωστή ανάγνωση και εγγραφή αρχείων

  • Το 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.

Περισσότεροι οδηγοί