将UTF-8编码格式的文本转换成简体中文GBK(ANSI-936)编码格式
:: 将UTF-8编码格式的文本转换成ANSI-936编码格式
::
:: 使用方法: call :UTF8_to_ANSI936 fileOut fileIn
::
:: 输入UTF-8编码格式的文本文档fileIn, 输出ANSI编码格式的文本文档strOut
::
:UTF8_to_ANSI936
CALL :GET_SYS_DEFAULT_ACTIVE_CODE_PAGE bf_CODE_PAGE
IF NOT "%POWERSHELL_EXE%"=="" (GOTO :U2A_TO_NEXT_1)
FOR /F "usebackq delims=" %%i IN (`WHERE PowerShell.exe 2^>NUL`) DO (CALL,SET POWERSHELL_EXE=%%i)
IF "%POWERSHELL_EXE%"=="" (GOTO :U2A_USE_CMD)
:U2A_TO_NEXT_1
FOR /F "usebackq tokens=2,* delims=. " %%i IN (`^(^^^"%POWERSHELL_EXE%^^^" $PSVersionTable 2^>NUL^)^|^(FINDSTR /C:^^^"PSVersion ^^^"^)`) DO (CALL,SET POWERSHELL_VER=%%i)
IF %POWERSHELL_VER% LSS 3 (GOTO :U2A_USE_CMD)
"%POWERSHELL_EXE%" Get-Content -Encoding UTF8 "%~2" ^| Out-File -Encoding Unicode "%TEMP%\U.bom"
:: 936: ANSI/OEM-简体中文GBK
CHCP 936 1>NUL 2>&1
GOTO :U2A_OUTPUT_ANSI936
:: GOTO :EOF
:U2A_USE_CMD
IF "%CERTUTIL_EXE%"=="" ( FOR /F "usebackq delims=" %%i IN (`WHERE certutil.exe 2^>NUL`) DO (CALL,SET CERTUTIL_EXE=%%i) )
IF "%CERTUTIL_EXE%"=="" (
ECHO Error: The system can NOT find the specified file: certutil.exe.
:: 2-系统找不到指定的文件。
CALL :PAUSE_AND_EXIT /B 2
)
:: https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/certutil
::
:: 并非所有版本的 certutil 都提供本文档介绍的所有参数和选项。
::
:: 可以通过运行 certutil -? 或 certutil <parameter> -? 来查看你的 certutil 版本提供的选项。
::
:: 在Win11 Beta版本中, certutil -?>mmmtxt, 结果有点乱
:: 1252: ANSI-拉丁语I
:: CHCP 1252 1>NUL 2>&1
ECHO FFFE>"%TEMP%\U.bom"
("%CERTUTIL_EXE%" -f -Unicode -decodehex "%TEMP%\U.bom" "%TEMP%\U.bom" 2) 1>NUL 2>&1
SET "CERTUTIL_EXE="
:: 65001: UTF-8
CHCP 65001 1>NUL 2>&1
:: /C参数只能放最后
::
:: 晕,有些文档转换后有少量乱码
::
CMD /U/D/C TYPE "%~2">"%TEMP%\%~n2_unicode-without-BOM.txt"
:: 936: ANSI/OEM-简体中文GBK
CHCP 936 1>NUL 2>&1
TYPE "%TEMP%\%~n2_unicode-without-BOM.txt">>"%TEMP%\U.bom"
DEL /F /Q "%TEMP%\%~n2_unicode-without-BOM.txt" 1>NUL 2>&1
:U2A_OUTPUT_ANSI936
TYPE "%TEMP%\U.bom">"%~1"
CHCP %bf_CODE_PAGE% 1>NUL 2>&1
SET "bf_CODE_PAGE="
DEL /F /Q "%TEMP%\U.bom" 1>NUL 2>&1
GOTO :EOF
:: END OF UTF8_to_ANSI936