Every time text crosses a tool boundary, the encoding rules change. Neither side raises an error. Only the output comes out quietly broken.
| Boundary | Symptom |
|---|---|
File → Get-Content | UTF-8 read as 949, written back, non-ASCII self-destructs |
| File → powershell.exe parser | No BOM, source read as ANSI, literals garbled |
| Shell heredoc → Python | Emoji surrogate pairs broken |
| PS → native exe arguments | Double quotes re-parsed, arguments split |
| Code → env var key | Non-ASCII key ignored or mangled |
Principles