加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 20:32:10 所属栏目:Windows 来源:网络整理
导读:我有一个Java应用程序,它使用InputStreamReader通过套接字接收数据.它从getEncoding方法报告“Cp1252”: /* java.net. */ Socket Sock = ...;InputStreamReader is = new InputStreamReader(Sock.getInputStream());System.out.println("Character 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_MACHINESYSTEMControlSet001" &_
                              "ControlNlsCodePageACP")
WScript.Echo "Switching console code page to " & cp
objShell.Exec "chcp.com " & cp

(这是我的第一个WSH脚本,因此它可能存在缺陷 – 我不熟悉注册表读取权限.)

使用TrueType字体是使用ANSI / Unicode和cmd.exe的另一个要求.在时间允许的情况下,我将看一个程序切换到更好的字体.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读