תיקון קידוד עברית ב-PowerShell

הסקריפט שלכם כותב ??? במקום עברית, או שהקונסולה מציגה אותיות משובשות? ב-Windows PowerShell 5.1 כל פקודה משתמשת בקידוד אחר. הנה הסיבות והפרמטרים הנכונים – ואת הקבצים המשובשים אפשר לתקן בדפדפן שלמעלה.

עובד עם טקסט ועם הקבצים האלה:

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

למשל קובצי ייצוא מאקסל, גיבויים של מסדי נתונים, כתוביות וקוד של אתרים.

תיקון

  1. גררו קובץ או הדביקו טקסט
  2. התיקון נעשה אוטומטית
  3. העתיקו או הורידו את התוצאה
או גררו את הקובץ לכאן
  • בלי העלאה. הקבצים מתוקנים ישירות בדפדפן ולעולם לא יוצאים מהמכשיר שלכם.

  • שרתים באיחוד האירופי. Mojibuster פועל על שרת בפינלנד (האיחוד האירופי), ולכן חלה עליו תקנת הגנת המידע הכללית (GDPR). נוסח התקנה (EUR-Lex, באנגלית)

הבעיה השורשית: לכל פקודה קידוד אחר

ב-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.

קובץ Windows-1255 שנקרא בטעות בקידוד אחר

לפני

îùúîù;îçì÷ä;òéø
ãðä ëäï;îëéøåú;úì àáéá
éåñé ìåé;øëù;çéôä

אחרי

משתמש;מחלקה;עיר
דנה כהן;מכירות;תל אביב
יוסי לוי;רכש;חיפה

קריאה וכתיבה נכונה של קבצים

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

מדריכים נוספים