求教, bat 脚本里,设了 chcp 仍然有中文无法正确显示

查看 42|回复 1
作者:sugarsalt   
从 stackoverflow 抄了一段用来使得特定行输出不一样颜色的 bat 脚本,但是用来输出中文文本会乱码
用了 chcp 65001 也不行
我的实验脚本如下
@echo off
SETLOCAL EnableDelayedExpansion
chcp 65001 >nul
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
set "text=什么"
echo %text%
call :ColorText 0c "%text%"
call :ColorText 0c "shen me"
pause
:ColorText
echo off
echo %DEL% > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof
echo 能正常显示“什么”,call :ColorText 0c "%text%"就不行
颜色代码来自前两个最高分回答
https://stackoverflow.com/questions/21660249/how-do-i-make-one-particular-line-of-a-batch-file-a-different-color-then-the-oth
我看不懂原本那个改颜色代码的原理,所以想请问一下大家有没有解决的办法?
谢谢

echo, colortext, Text, nul

geelaw   
这段代码相当糟糕,是利用 findstr 这个工具显示文件名,因此你传入的字符串必须是合法的文件名,而且显示的时候会覆盖当前目录下的同名文件——总之就是个不定时炸弹。
如果必须要用 batch ,推荐 https://gist.github.com/mlocati/fdabcaeb8071d5c75a2d51712db24011
否则可以考虑 PowerShell
另外请不要在 bat 里面 chcp ,这是在劫持用户的 console ,而且我没找到如何让 Windows 以固定的编码读取 batch 的功能,它或许永远是以系统代码页读取 batch 并运行的,也可能是按照当前代码页一次读取一行运行的。考虑如下 UTF-8 的 batch:
chcp 932>nul 2>nul
chcp 65001>nul 2>nul && echo ¿
其中 echo 的字符是 U+00BF ,它的 UTF-8 编码是 0xC2 0xBF ,一开始的 932 是 Windows 的 Shift JIS 实现,在这个代码页里 0xC2 不是合法的开头字节,因此在默认的日语 Windows 上执行它会产生不可预知的后果。
实际效果是打印出来的并不是倒转的问号,而是 ツソ 这两个符号。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部