字符'ä'在批处理文件的输入参数中读取为'õ'



我的程序有一个输入参数来识别它应该运行哪个函数。我现在正在准备一些.bat文件,我的程序可以接受的输入参数之一被称为"hänvisnigskälla"(瑞典语为参考源)。

程序在我自己的计算机上运行良好,但是当我将其移动到生产服务器时,我看到程序不识别函数名并将其读取为"hõnvisnigskõlla"。因此,ä字符在某处被误读为õ

我想知道发生这种情况的原因,以及是否有办法在服务器计算机上修复它。

这是因为控制台的代码页与系统的其他部分不同。您的Windows UI可能使用代码页1252作为其默认的遗留代码页(其中Unicode不适用)。当保存文件并选择"ANSI"作为编码时,这也适用于记事本。

另一方面,控制台可能使用代码页850或437,其中在代码页1252中"ä"所在的地方有"õ"。

因此,要么在记事本中使用»"«(在CP850中与»ä«位于同一位置),要么使用不同的编辑器,允许您以OEM编码保存文件,或者使用不同的音译,即使它在技术上不正确。

另一个选择是使用chcp将控制台的代码页更改为1252,作为您在批处理文件中做的第一件事。然后输出也将是正确的。但是这会更改控制台的代码页—即使在批处理文件结束之后(至少如果在交互式控制台会话中调用它),这个更改也会持续存在。所以我通常会尽量避免这个

除了joey的答案,您还可以在更改之前备份chcp

@echo off
rem backup the current chcp
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
rem set your own
chcp 865>nul
:: your stuff here ::
rem restore chcp
chcp %cp%>nul

Code page: Country/region or language
437      : United States
850      : Multilingual (Latin I)
852      : Slavic (Latin II)
855      : Cyrillic (Russian)
857      : Turkish
860      : Portuguese
861      : Icelandic
863      : Canadian-French
865      : Nordic
866      : Russian
869      : Modern Greek

完整的代码页标识符

进一步了解这个bug http://blogs.msdn.com/b/oldnewthing/archive/2005/03/08/389527.aspx

最新更新