Abstract:在未指定区域设置时,可能会发现意外得可移植性问题。
Explanation:对可能与区域设置相关得数据进行比较时,应指定相应得区域设置。
发生原因:
当涉及到字符串比较或排序等操作时,地区设置相关的比较(Locale Dependent Comparison)是一个常见的可移植性漏洞。这个漏洞会导致程序在不同地区设置下产生不一致的结果,因为不同地区使用不同的字符排序规则、大小写敏感性和其他比较规则。
这种漏洞的影响范围很广,特别是在跨平台或国际化的软件中。举例来说,某些地区会将特定的字符视为不同的字符,而其他地区则将其视为相同。这就会导致在不同地区环境下,相同的字符串比较结果不一致。
举例:
private String test(String a){
if ("hello".equals(a.toLowerCase())){
//
}
return null;
}
说明:就是说不同地区出现的结果可能会不一样,某些地区会将特定的字符视为不同的字符,而其他地区则将其视为相同。这就会导致在不同地区环境下,相同的字符串比较结果不一致。
修复方案:为了防止出现此问题,请始终确保指定默认区域设置,或者指定可以接受这些字符(如toLowerCase()并带有 API 的区域设置。
private String test(String a){
if ("hello".equals(a.toLowerCase(Locale.ENGLISH))){
//
}
return null;
}
另外,Java中的java.lang.String.equalsIgnoreCase() API 以防止出现此问题。
equalsIgnoreCase()方法可以避免由于地区设置相关的字符排序规则而导致的比较结果不一致的问题。这是因为它只关注字母的相等性,而不依赖于具体的地区设置
因此,也可以修改为:
private String test(String a){
if ("hello".equalsIgnoreCase(a)){
//
}
return null;
}