`

Java研究 -- Jdk获取本地计算机名称的一个Bug

 
阅读更多

    通过Java1.6的jdk获取中文计算机名称时,存在一个bug。

 

前提条件

 

  • 运行程序的计算机名称中含有中文,如:中文名称_ENGLISH
  • 运行程序的计算机ip为10.36.24.17

 

 

代码如下:

 

public class NetAddress {
 
	public static void println(String s, InetAddress address){
	 
		String sName = address.getHostName();
		String sIp = address.getHostAddress();
		System.out.println(s + "_" + sName + "_" + sIp);
		System.out.println("名称byte数组:" + Arrays.toString(sName.getBytes()));
	}
	
	public static void main(String[] args) throws UnknownHostException{
//		NetAddress n = new NetAddress();
//		n.show2();
		
		// 本地
		InetAddress address1 = InetAddress.getLocalHost();
		println("local", address1);
		
		// 
		InetAddress address2 = InetAddress.getByName("10.36.24.17");;
		println("getByName", address2);
 
		InetAddress address3 = InetAddress.getByName("127.0.0.1");;
		println("127.0.0.1", address3);
		
		InetAddress address4 = InetAddress.getByName("");;
		println("空", address4);
	 
	}
	
}

以上程序,通过4种方法获取计算机的信息,并分别打印计算机的名称和IP,同时把计算机名称byte字节流也逐一打印出来。

 

执行程序,打印信息如下:

 

local_????????_ENGLIS_10.36.24.17
名称byte数组:[63, 63, 63, 63, 63, 63, 63, 63, 95, 69, 78, 71, 76, 73, 83]

getByName_中文名称_ENGLISH_10.36.24.17
名称byte数组:[-42, -48, -50, -60, -61, -5, -77, -58, 95, 69, 78, 71, 76, 73, 83, 72]

127.0.0.1_localhost_127.0.0.1
名称byte数组:[108, 111, 99, 97, 108, 104, 111, 115, 116]

空_localhost_127.0.0.1
名称byte数组:[108, 111, 99, 97, 108, 104, 111, 115, 116]

 

结论: 

 

从打印信息可以看出:

 

  • InetAddress.getLocalHost() 获取的信息,如果计算机名称为中文,则会出现问题。因为名称字节流无论中、英文都用1个字节表示,自然会出现乱码。
  • InetAddress.getByName("10.36.24.17")获取的信息,无论计算机是中文还是英文都是正确的。因为名称此字节流中使用2个字节表示中文,1个字节表示英文。
  • InetAddress.getByName("127.0.0.1") 和 InetAddress.getByName("")获取的计算机名称都是“localhost

 

 bug无处不在,没想到JDK自带类也存在bug

 

1
9
分享到:
评论
8 楼 huangrongyou 2012-09-03  
kjj 写道
huangrongyou 写道
虽然可以通过IP地址获取正确的中文计算机名称。但是在开发的时候,你不知道发布服务器的IP地址。这时,最好能够调用InetAddress.getLocalHost()能够获取正确的中文计算机名称。而实际调用此方法无法获取正确的中文名称,与InetAddress.getLocalHost()原意是获取计算机的中文名称和IP的意义相矛盾,所以,说它存在bug。

java内部都是unicode编码的,外部传来的字符各种编码都有,你让jdk挨个遍历一下编码格式,然后返回给你??,jdk怎么会知道哪个文本串人看得懂,哪个人看不懂,他只是按照国际标准执行了,为什么你不说是你们服务器上操作系统bug呢,
如果你说这个是java的bug,有点无理取闹了



首先,这里返回根本不是unincode。名称和对应的byte字节如下:
中      文      名       称  _  E   N    G  L   I   S    H
[63, 63, 63, 63, 63, 63, 63, 63, 95, 69, 78, 71, 76, 73, 83] 

所有的中文都被表示成63 63。
比如正确的中应该是 -42, -48;而不应该是63,63.
另外,我在xp、win7上都做过实验,都存在以上问题。一台机子就算了,如果多台机子都这样,要怎么说呢。
7 楼 kjj 2012-09-03  
huangrongyou 写道
虽然可以通过IP地址获取正确的中文计算机名称。但是在开发的时候,你不知道发布服务器的IP地址。这时,最好能够调用InetAddress.getLocalHost()能够获取正确的中文计算机名称。而实际调用此方法无法获取正确的中文名称,与InetAddress.getLocalHost()原意是获取计算机的中文名称和IP的意义相矛盾,所以,说它存在bug。

java内部都是unicode编码的,外部传来的字符各种编码都有,你让jdk挨个遍历一下编码格式,然后返回给你??,jdk怎么会知道哪个文本串人看得懂,哪个人看不懂,他只是按照国际标准执行了,为什么你不说是你们服务器上操作系统bug呢,
如果你说这个是java的bug,有点无理取闹了
6 楼 huangrongyou 2012-09-03  
虽然可以通过IP地址获取正确的中文计算机名称。但是在开发的时候,你不知道发布服务器的IP地址。这时,最好能够调用InetAddress.getLocalHost()能够获取正确的中文计算机名称。而实际调用此方法无法获取正确的中文名称,与InetAddress.getLocalHost()原意是获取计算机的中文名称和IP的意义相矛盾,所以,说它存在bug。
5 楼 huangrongyou 2012-09-03  
jbwang008 写道
这算什么bug,是人家写的方法而已,不是提供了可以正确读取中文的的方法么



那请教怎么读取正确的本地中文名称呢。
4 楼 jbwang008 2012-08-31  
这算什么bug,是人家写的方法而已,不是提供了可以正确读取中文的的方法么
3 楼 no1dog 2012-08-31  
luciferdevil 写道
kjj 写道
这也算bug??

++

2 楼 luciferdevil 2012-08-31  
kjj 写道
这也算bug??

++
1 楼 kjj 2012-08-31  
这也算bug??

相关推荐

    aspose aspose-words-23.3-jdk16 aspose-words-23.3-jdk16 aspose-w

    word java 导出 aspose aspose-words-23.3-jdk16word java 导出 aspose aspose-words-23.3-jdk16word java 导出 aspose aspose-words-23.3-jdk16word java 导出 aspose aspose-words-23.3-jdk16word java 导出 ...

    aspose-words-19.2-jdk16 本地仓库地址

    aspose-words-19.2-jdk16 本地仓库地址,若有问题请及时联系我。 获取license方法如下 public static boolean getLicense() throws Exception { boolean result = false; try { InputStream is = ...

    java-jdk1.8-8u361-all-jdk-win-linux

    java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...

    bcprov-ext-jdk15on-152和bcprov-jdk15on-152

    标题中的"bcprov-ext-jdk15on-152"和"bcprov-jdk15on-152"是两个与Bouncy Castle库相关的Java档案文件,它们主要用于提供加密和安全服务。Bouncy Castle是一个开源的Java安全提供者,广泛用于密码学应用,包括加密、...

    java-jdk1.8-jdk-8u181-windows-x64.zip

    这个压缩包"java-jdk1.8-jdk-8u181-windows-x64.zip"内包含两个文件:一个是主安装程序“jdk-8u181-windows-x64.exe”,用于在Windows 64位系统上安装JDK 1.8的更新181版本;另一个是“使用说明.txt”,通常会提供...

    bcprov-ext-jdk15on-1.54.jar,bcprov-jdk15on-1.54.jar

    在Java开发过程中,有时会遇到一个异常:“java.lang.RuntimeException: Could not generate DH keypair”。这个异常通常是由于Java加密库的问题导致的,特别是在进行安全通信,如使用SSL/TLS协议时,系统尝试生成...

    aspose-words-21.1-jdk17.jar jar包和示例

    aspose-words-21.1-jdk17.jar 处理word转pdf,无水印无文件大小限制,无使用时间限制,可以用于word编辑处理,转pdf等用途。 。由于aspose调用的时候有点消耗内存,操作大文件的时候可能会堆溢出,所以请先设置好...

    openjdk-8-jdk离线包及依赖.zip

    OpenJDK(Open Source Java Development Kit)是Oracle JDK的一个开源实现,提供了Java开发和运行所需的全部工具。这个压缩包包含了OpenJDK 8的二进制文件及其必要的依赖项,以便在没有网络连接的情况下进行离线安装...

    java-jdk1.8-jdk-8u191-windows-x64.zip

    此外,压缩包中还包含了一个名为`使用说明.txt`的文件,这可能是一份简要的使用指南或注意事项,建议用户在安装后查阅,以获取更多关于如何使用和管理Java JDK 1.8的详细信息。例如,如何配置IDE集成、如何更新JDK、...

    bcprov-ext-jdk15on-1.54.jar和bcprov-jdk15on-1.54.jar压缩文件

    bcprov-ext-jdk15on则是bcprov-jdk15on的一个扩展版,它除了包含bcprov-jdk15on的所有功能外,还额外提供了一些高级特性和非标准算法。比如,一些更复杂的密码协议、椭圆曲线加密(ECC)以及一些非主流的加密算法。...

    sun-java6-jdk

    【标题】"sun-java6-jdk" 是Oracle公司(前身为Sun Microsystems)为Java开发环境提供的一个关键组件,它包含了Java Development Kit(JDK),是Java编程语言的基础工具集。这个压缩包文件提供了用于开发、编译、...

    bcprov-jdk15on-1.54.jar bcprov-ext-jdk15on-1.54.jar下载

    2.将下载的两个JAR文件复制到:JDK安装目录\jre\lib\ext下,例如我的就是D:\Program Files (x86)\java\JDK1.6\jre\lib\ext 3.打开java.security文件:在JDK安装目录\jre\lib\security下的java.security文件。

    bcprov-ext-jdk15on-1.52和bcprov-jdk15on-1.52

    Bouncy Castle是一个广泛使用的开源Java安全API,它为Java平台提供了加密、密钥管理和数字签名等功能。 1. **Bouncy Castle 简介** Bouncy Castle 提供了两个主要的组件:轻量级加密API(Lightweight Cryptography...

    bcprov-ext-jdk15on-1.52.jar和bcprov-jdk15on-1.52.jar

    Bouncy Castle是一个开源的Java安全套件,提供广泛的安全服务,包括加密、密码学算法实现、SSL/TLS协议处理以及PKI(公钥基础设施)工具。 首先,我们来看"bcprov-jdk15on-1.52.jar"。这个文件是Bouncy Castle的...

    java_ee_sdk-7-jdk7-windows-ml

    java_ee_sdk-7-jdk7-windows-ml

    aspose-words-16.4.0-jdk16.jar

    aspose-words-16.4.0-jdk16.jar 是Aspose对Word文档转换PDF所用的Jar包

    Ubuntu下安装sun-java6-jdk和eclipse

    首先,确保SUN-JDK-6是系统默认的Java版本,使用`sudo update-java-alternatives -s java-6-sun`。 3. **编辑JVM配置文件**:编辑`/etc/jvm`,在文件顶部添加`/usr/lib/jvm/java-6-sun`,如果没有该文件则需自行...

    bcprov-jdk15on bcprov-ext-jdk15on 下载

    Bouncy Castle是一个著名的开源加密库,广泛用于Java和.NET平台上,提供了大量的加密算法,如RSA、AES、DES等,同时也支持SSL/TLS协议和PKI(公钥基础设施)。 1. **Bouncy Castle库**:Bouncy Castle最初是为了在...

    修改版json-lib-2.4-jdk14与json-lib-2.4-jdk13 支持JDK1.4与1.3与1.5

    remove是java.lang.ThreadLocal类的方法,但是jdk1.4中,却没有这个方法的实现,jdk1.5中有这个方法,因此是没问题的; 本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons...

    java_ee_sdk-7-jdk7-windows-x64-ml

    java_ee_sdk-7-jdk7-windows-x64-ml

Global site tag (gtag.js) - Google Analytics