如何指定与基础Windows代码页一致的Java file.encoding值?

前端之家收集整理的这篇文章主要介绍了如何指定与基础Windows代码页一致的Java file.encoding值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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.).

通过-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的另一个要求.在时间允许的情况下,我将看一个程序切换到更好的字体.

原文链接:https://www.f2er.com/windows/371801.html

猜你在找的Windows相关文章