הבעיה השורשית: לכל פקודה קידוד אחר
ב-Windows PowerShell 5.1 כמעט לכל פקודה יש ברירת מחדל משלה: Get-Content קורא קבצים בלי BOM כ-ANSI (ב-Windows בעברית זה Windows-1255), Out-File ו-> כותבים UTF-16, Set-Content כותב ANSI ו-Export-Csv כותב ASCII. PowerShell 7 איחד את זה ומשתמש בכל מקום ב-UTF-8 בלי BOM.
לפני
îùúîù;îçì÷ä;òéø ãðä ëäï;îëéøåú;úì àáéá éåñé ìåé;øëù;çéôä
אחרי
משתמש;מחלקה;עיר דנה כהן;מכירות;תל אביב יוסי לוי;רכש;חיפה
קריאה וכתיבה נכונה של קבצים
Get-Content data.csv -Encoding UTF8קורא נכון קובצי UTF-8 גם בלי BOM.Set-Content,Out-Fileו-Add-Contentכותבים UTF-8 עם-Encoding UTF8– ב-5.1 תמיד עם BOM.Export-Csv data.csv -Encoding UTF8 -NoTypeInformationבמקום ברירת המחדל ASCII, שמחליפה אותיות עבריות ב-?.- לכל הפקודות בבת אחת:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'בראש הסקריפט. - לקובץ ישן בעברית ANSI:
Get-Content old.txt -Encoding Default(ב-5.1), או ב-PowerShell 7-Encoding windows-1255.
בקשות רשת עם Invoke-RestMethod ו-Invoke-WebRequest
אם השרת לא מציין ערכת תווים ב-Content-Type, Windows PowerShell 5.1 מפענח את התשובה כ-ISO-8859-1. תשובות UTF-8 מכילות אז ×©×œ×•× במקום שלום. הפתרון: משכו את התשובה כבתים ופענחו בעצמכם, למשל עם [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
קובצי סקריפט עם עברית
אם שומרים סקריפט כ-UTF-8 בלי BOM, Windows PowerShell 5.1 קורא אותו כ-ANSI. תווים במחרוזות כמו Write-Host 'שלום' יוצגו אז משובשים. שמרו קובצי .ps1 כ-UTF-8 עם BOM – ב-VS Code דרך הקידוד בשורת המצב, ב-Notepad++ דרך תפריט Encoding ← UTF-8-BOM.
הקונסולה
אם רק חלון הקונסולה מציג תווים שגויים, הקובץ עצמו לרוב תקין – הקונסולה קוראת UTF-8 כדף קוד DOS (ב-Windows בעברית בדרך כלל 862). עוד על התבנית הזו. שנו את הפלט עם [Console]::OutputEncoding = [Text.Encoding]::UTF8. לפלט שמועבר לתוכנות חיצוניות הגדירו גם $OutputEncoding = [Text.Encoding]::UTF8.
אם הקובץ כבר נכתב משובש, גררו אותו לתיבה שלמעלה: Mojibuster מתקן ×©×œ×•× ודומיו וממיר קבצי ANSI ל-UTF-8, כמו שמתואר בהמרת Windows-1255 ל-UTF-8. אם הקובץ כבר מכיל סימני שאלה, הטקסט אבד.
שאלות נפוצות
איזו גרסת PowerShell יש לי?
$PSVersionTable.PSVersion מציג אותה. 5.1 הוא Windows PowerShell המובנה ב-Windows; מגרסה 7 והלאה הוא נקרא פשוט PowerShell ומשתמש ב-UTF-8 כברירת מחדל.
למה אקסל פותח לא נכון את ה-CSV שיצר PowerShell?
PowerShell 7 כותב UTF-8 בלי BOM, ואקסל לא מזהה אותו. השתמשו ב--Encoding utf8BOM או שמרו את הקובץ עם BOM ב-Mojibuster. עוד באקסל והעברית.
צריך chcp 65001?
רק לתוכנות שעוקבות אחר דף הקוד של הקונסולה. בתוך PowerShell מספיק [Console]::OutputEncoding.