我有一个Java应用程序,它使用InputStreamReader通过套接字接收数据.它从getEncoding方法报告“Cp1252”:
/* java.net. */ Socket Sock = ...; InputStreamReader is = new InputStreamReader(Sock.getInputStream()); System.out.println("Character encoding = " + is.getEncoding()); // Prints "Character encoding = Cp1252"
这不一定与系统报告的代码页相匹配.例如:
C:\>chcp Active code page: 850
应用程序可以接收字节0x81,其在代码页850中表示字符ü.程序用代码页1252解释该字节,该代码页没有定义该值的任何字符,所以我得到一个问号.
通过在启动应用程序的批处理文件中添加另一个命令行选项,我能够为使用代码页850的一个客户解决此问题:
java.exe -Dfile.encoding=Cp850 ...
但当然,并非所有客户都使用代码页850.如何让Java使用与底层Windows系统兼容的代码页?我的偏好是我可以放在批处理文件中,保持Java代码不变:
ENC=... java.exe -Dfile.encoding=%ENC% ...
cmd.exe使用的默认编码是Cp850(或者操作系统本机的“OEM”CP);系统编码是Cp1252(或任何“ANSI”CP是OS本机的).
Gory details here.发现控制台编码的一种方法是执行
via native code(有关当前控制台编码,请参阅
GetConsoleOutputCP;有关默认“ANSI”编码,请参阅
GetACP;
etc.).
原文链接:https://www.f2er.com/windows/371801.html通过-D开关更改编码将影响所有默认编码机制,包括重定向的stdout / stdin / stderr.这不是一个理想的解决方案.
我想出了这个可以将控制台设置为系统ANSI代码页的WSH脚本,但是还没弄清楚如何以编程方式切换到TrueType字体.
'file: setacp.vbs 'usage: cscript /Nologo setacp.vbs Set objShell = CreateObject("WScript.Shell") 'replace ACP (ANSI) with OEMCP for default console CP cp = objShell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001" &_ "\Control\Nls\CodePage\ACP") WScript.Echo "Switching console code page to " & cp objShell.Exec "chcp.com " & cp
(这是我的第一个WSH脚本,因此它可能存在缺陷 – 我不熟悉注册表读取权限.)
使用TrueType字体是使用ANSI / Unicode和cmd.exe的另一个要求.在时间允许的情况下,我将看一个程序切换到更好的字体.