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:
Codex
2026-07-30 22:50:23 +03:00
parent db4f33f725
commit 71e2fef4d9
3 changed files with 11 additions and 8 deletions
+9 -6
View File
@@ -69,12 +69,15 @@ run.bat запуск в один клик (спрашивае
## Соглашения и подводные камни ## Соглашения и подводные камни
- **Кодировка файлов `.bat`:** **UTF-8 без BOM**, окончания строк **CRLF**, и первой - **Кодировка файлов `.bat`:** **UTF-8 с BOM**, окончания строк **CRLF**, и `chcp 65001 >nul`
командой после `@echo off``chcp 65001 >nul` (консоль в UTF-8, иначе кириллица после `@echo off`. Именно **BOM** заставляет `cmd` читать .bat как UTF-8 независимо
в echo/set/for превратится в мусор). Проверено: `echo`, `set /p`, `for /f` и от OEM-кодировки консоли (без BOM + `chcp 65001` в `cmd` даёт `????` — cmd читает
перенаправление в файл корректно работают с кириллицей под `chcp 65001`. файл по OEM-кодировке, а не по `chcp`). BOM + `chcp 65001` проверено: кириллица в
Пиши через `[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($false))`. `echo`/`set /p`/`for /f` отображается корректно, `@echo off` работает. Альтернатива
(BOM не ставить — ломает первую строку `@echo off` на старых Windows.) без 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. То же самое правило — не использовать - **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
`Set-Content -Encoding UTF8` (ставит BOM). Используй `Set-Content -Encoding UTF8` (ставит BOM). Используй
`[System.IO.File]::WriteAllText(path, content, [Text.UTF8Encoding]::new($false))`. `[System.IO.File]::WriteAllText(path, content, [Text.UTF8Encoding]::new($false))`.
+1 -1
View File
@@ -1,4 +1,4 @@
@echo off @echo off
REM ============================================================ REM ============================================================
REM web-vnc launcher - запуск в один клик. Спрашивает только пароль. REM web-vnc launcher - запуск в один клик. Спрашивает только пароль.
REM ============================================================ REM ============================================================
+1 -1
View File
@@ -1,4 +1,4 @@
@echo off @echo off
REM ============================================================ REM ============================================================
REM open-firewall.bat - открывает порт 8080 в Windows Firewall. REM open-firewall.bat - открывает порт 8080 в Windows Firewall.
REM Запускать от имени администратора (один раз). REM Запускать от имени администратора (один раз).