แก้ภาษาไทยเพี้ยนใน PowerShell

สคริปต์ของคุณเขียน ??? หรือภาษาต่างดาวแทนภาษาไทย หรือหน้าต่างคอนโซลแสดงข้อความเพี้ยนใช่ไหม Windows PowerShell 5.1 ใช้รหัสอักขระต่างกันตามแต่ละคำสั่ง ต่อไปนี้คือสาเหตุและพารามิเตอร์ที่ถูกต้อง – ส่วนไฟล์ที่เสียแล้วซ่อมได้ในเบราว์เซอร์ด้านบน

รองรับข้อความและไฟล์เหล่านี้:

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

เช่น ไฟล์ส่งออกจาก Excel ข้อมูลสำรองฐานข้อมูล คำบรรยาย หรือโค้ดเว็บไซต์

แก้ไข

  1. ลากไฟล์มาวางหรือวางข้อความ
  2. แก้ให้อัตโนมัติ
  3. คัดลอกหรือดาวน์โหลด
หรือลากไฟล์มาวางที่นี่
  • ไม่ต้องอัปโหลด ไฟล์ถูกแก้ในเบราว์เซอร์ของคุณและไม่ออกจากอุปกรณ์

  • เซิร์ฟเวอร์ในสหภาพยุโรป Mojibuster ทำงานบนเซิร์ฟเวอร์ที่ ฟินแลนด์ (สหภาพยุโรป) จึงอยู่ภายใต้กฎหมายคุ้มครองข้อมูลทั่วไป (GDPR) อ่าน GDPR (EUR-Lex ภาษาอังกฤษ)

ต้นตอของปัญหา: แต่ละคำสั่งใช้รหัสอักขระต่างกัน

ใน Windows PowerShell 5.1 แทบทุกคำสั่งมีรหัสอักขระเริ่มต้นของตัวเอง: Get-Content อ่านไฟล์ที่ไม่มี BOM เป็น ANSI (ในวินโดวส์ไทยคือ Windows-874) Out-File และ > เขียนเป็น UTF-16 Set-Content เขียนเป็น ANSI และ Export-Csv เขียนเป็น ASCII ส่วน PowerShell 7 รวมให้เป็นหนึ่งเดียวและใช้ UTF-8 แบบไม่มี BOM ทุกที่

ไฟล์ UTF-8 ที่อ่านด้วย Get-Content ใน PowerShell 5.1

ก่อน

¼Ùéãªé;á¼¹¡;ÊÒ¢Ò
ÊÁªÒ 㨴Õ;½èÒ¢ÒÂ;àªÕ§ãËÁè
ÊØÁÒÅÕ ÃÑ¡ä·Â;½èÒ¨Ѵ«×éÍ;¢Í¹á¡è¹

หลัง

ผู้ใช้;แผนก;สาขา
สมชาย ใจดี;ฝ่ายขาย;เชียงใหม่
สุมาลี รักไทย;ฝ่ายจัดซื้อ;ขอนแก่น

อ่านและเขียนไฟล์ให้ถูกต้อง

  • 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' ที่บรรทัดแรกของสคริปต์

คำขอเว็บด้วย 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

คอนโซล

ถ้ามีแค่หน้าต่างคอนโซลที่แสดงอักขระผิดหรือเป็นสี่เหลี่ยม ไฟล์มักไม่เสีย – ฟอนต์ของคอนโซลอาจแสดงภาษาไทยไม่ได้ หรือรหัสอักขระของเอาต์พุตต่างไป ให้เปลี่ยนด้วย [Console]::OutputEncoding = [Text.Encoding]::UTF8 และสำหรับข้อมูลที่ส่งต่อให้โปรแกรมภายนอก ให้ตั้ง $OutputEncoding = [Text.Encoding]::UTF8 ด้วย

ถ้าไฟล์ถูกเขียนเสียไปแล้ว วางลงในช่องด้านบน: Mojibuster ซ่อมภาษาต่างดาวอย่าง เธชเธง และแปลงไฟล์ TIS-620 เป็น UTF-8 ได้ ดู แปลง TIS-620 เป็น UTF-8 แต่ถ้าในไฟล์มีเครื่องหมายคำถามอยู่แล้ว ข้อความหายไปแล้ว – อ่านที่ mojibake คืออะไร

คำถามที่พบบ่อย

ฉันใช้ PowerShell เวอร์ชันไหน

$PSVersionTable.PSVersion จะบอก 5.1 คือ Windows PowerShell ที่มากับวินโดวส์ ตั้งแต่ 7 ขึ้นไปเรียกว่า PowerShell เฉย ๆ และใช้ UTF-8 เป็นค่าเริ่มต้น

ทำไม Excel เปิดไฟล์ CSV จาก PowerShell ผิด

PowerShell 7 เขียน UTF-8 แบบไม่มี BOM ซึ่ง Excel จำไม่ได้ ให้ใช้ -Encoding utf8BOM หรือบันทึกไฟล์แบบมี BOM ใน Mojibuster อ่านเพิ่มที่ Excel และ CSV ภาษาไทยเพี้ยน

ต้องใช้ chcp 65001 ไหม

เฉพาะโปรแกรมที่ทำตามโค้ดเพจของคอนโซล ภายใน PowerShell แค่ [Console]::OutputEncoding ก็พอ

คู่มืออื่น ๆ