ต้นตอของปัญหา: แต่ละคำสั่งใช้รหัสอักขระต่างกัน
ใน 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 ทุกที่
ก่อน
¼Ùéãªé;á¼¹¡;ÊÒ¢Ò ÊÁªÒ 㨴Õ;½èÒ¢ÒÂ;àªÕ§ãËÁè ÊØÁÒÅÕ ÃÑ¡ä·Â;½èÒ¨Ѵ«×éÍ;¢Í¹á¡è¹
หลัง
ผู้ใช้;แผนก;สาขา สมชาย ใจดี;ฝ่ายขาย;เชียงใหม่ สุมาลี รักไทย;ฝ่ายจัดซื้อ;ขอนแก่น
อ่านและเขียนไฟล์ให้ถูกต้อง
Get-Content data.csv -Encoding UTF8อ่านไฟล์ UTF-8 ได้ถูกต้องแม้ไม่มี BOMSet-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 ก็พอ