UTF-8 代码页标识符 (65001) 在其他计算机上会有所不同吗?

UTF-8 代码页标识符 (65001) 在其他计算机上会有所不同吗?

我最近试图向朋友解释如何创建一个简单的单行批处理文件:

subst t: "X:\Example"

在我的计算机上多年来一直运行良好,但在他们的计算机上我遇到了一个问题:他们的名字包含非 ASCII 字符(确切地说是土耳其字符 ı 和 ç),这些字符无法正确识别。

对此,我想补充的简单解决方案是

chcp 65001

在文件顶部将活动代码页更改为 UTF-8。

但这不起作用。在他们的计算机上,这导致执行它的命令 shell 崩溃。我让他们尝试了几个不同的值;65000 崩溃了,但 10000 没有崩溃,我尝试的所有低于这个值的值也都起作用了,但与我电脑上的相同值不对应相同的代码页。他们的默认代码页也不同(857 而不是我电脑上的 850。这是有道理的,因为根据 MSDN,857 是土耳其代码页,850 是西欧代码页)。

我知道某些代码页在不同计算机之间会有所不同,但 MSDN 页面明确指出应该使用 UTF-8,因为其他页面可能会发生变化(尽管缺乏有关它们如何以及何时发生变化的文档)。

这是假的吗?65001 的值也能改变吗?如果能,为什么会导致崩溃?它不应该在最坏的情况下抱怨“无效代码页”吗?如果它确实改变了,如何找出要使用哪个值来获取它,或者我如何让它接受非 ASCII 字符?

我使用的是带有英语的 Windows 10(预装了意大利语 Windows 8.1),而我的朋友使用的是土耳其语 Windows 7。

答案1

基本上,Windows cmd(以及它的批处理脚本解释器)依赖于(当前)活动代码页和批处理脚本编码的一致性。例如,如果您以Notepad所谓的美国国家标准编码(很大程度上取决于Windows 系统区域设置),那么你应该在相应的代码页下运行它,参见国家语言支持 (NLS) API 参考

  • English (US) : 美国国家标准对应于 ACP 1252(CP 437),
  • English (UK) : 美国国家标准对应于 ACP 1252(CP 850),
  • Turkish : 美国国家标准对应于 ACP 1254(CP 857),
  • Central Europe: 美国国家标准对应于ACP 1250(CP 852)等。

你的假设是正确的:

对此,我想补充的简单解决方案是 chcp 65001 在文件顶部将活动代码页更改为UTF-8。……但这不起作用。

不幸的是,Windowscmd和批处理解释器都不关心字节顺序标记并将其视为有效字符 - 忽略当前活动的代码页。 因此
CHCP 65001UTF-8编码文件是弄脏了如果 BOM 存在;尝试运行此类肮脏的命令将导致错误消息' CHCP' is not recognized as an internal or external command, operable program or batch file(errorlevel 9009)。

解决方案:保存脚本UTF-8编码无BOM
如果无法做到这一点(因为总是Notepad写入 BOM),请采用以下解决方法:使用虚拟命令作为脚本的第一行,例如:

@rem if this line is visibly executed then BOM is present >NUL 2>&1
@echo OFF
    rem save current code page to the `_chcp` variable
for /F "tokens=2 delims=:" %%G in ('chcp') do set "_chcp=%%G"
    rem change active code page to UTF-8 (silently)
CHCP 65001 >NUL
    rem echo this is UTF-8 encoded batch file %~nx0
echo(
subst t: "D:\bat\Unusual Names\Türkçe (Türkiye)\çğüşöıĞÜİŞÇÖ"
subst
dir /B /S t:\*.txt
subst t: /D
echo(
echo(  works as well for characters from Unicode Basic Multilingual Plane
subst t: "D:\bat\Unusual Names\CJK\中文(繁體)"
subst
dir /B /S t:\*.txt
subst t: /D
echo(
echo(  works even for characters from Unicode Supplementary Multilingual Plane
subst t: "D:\bat\Unusual Names\

相关内容