fix: use UTF-8 BOM for .bat so cmd shows Cyrillic correctly
UTF-8 without BOM + chcp 65001 showed '????' because cmd reads .bat under the OEM codepage, not chcp. A UTF-8 BOM makes cmd read the file as UTF-8 regardless of the console codepage; verified Cyrillic in echo/set/for displays correctly even when cmd starts at cp866. AGENTS.md updated accordingly.
This commit is contained in:
@@ -69,12 +69,15 @@ run.bat запуск в один клик (спрашивае
|
||||
|
||||
## Соглашения и подводные камни
|
||||
|
||||
- **Кодировка файлов `.bat`:** **UTF-8 без BOM**, окончания строк **CRLF**, и первой
|
||||
командой после `@echo off` — `chcp 65001 >nul` (консоль в UTF-8, иначе кириллица
|
||||
в echo/set/for превратится в мусор). Проверено: `echo`, `set /p`, `for /f` и
|
||||
перенаправление в файл корректно работают с кириллицей под `chcp 65001`.
|
||||
Пиши через `[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($false))`.
|
||||
(BOM не ставить — ломает первую строку `@echo off` на старых Windows.)
|
||||
- **Кодировка файлов `.bat`:** **UTF-8 с BOM**, окончания строк **CRLF**, и `chcp 65001 >nul`
|
||||
после `@echo off`. Именно **BOM** заставляет `cmd` читать .bat как UTF-8 независимо
|
||||
от OEM-кодировки консоли (без BOM + `chcp 65001` в `cmd` даёт `????` — cmd читает
|
||||
файл по OEM-кодировке, а не по `chcp`). BOM + `chcp 65001` проверено: кириллица в
|
||||
`echo`/`set /p`/`for /f` отображается корректно, `@echo off` работает. Альтернатива
|
||||
без BOM — включить системную опцию «Beta: Use Unicode UTF-8 for worldwide language
|
||||
support» (тогда OEM-кодировка = 65001), но это влияет на всю систему (нужен reboot,
|
||||
могут ломаться legacy-приложения под cp866/cp1251) — поэтому по умолчанию BOM.
|
||||
Пиши через `[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($true))`.
|
||||
- **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
|
||||
`Set-Content -Encoding UTF8` (ставит BOM). Используй
|
||||
`[System.IO.File]::WriteAllText(path, content, [Text.UTF8Encoding]::new($false))`.
|
||||
|
||||
Reference in New Issue
Block a user