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