2.10 IDS09-J如果没有指定适当的locale,不要使用locale相关方法处理与locale相关的数据
当locale没有明确指定的时候,使用locale相关的方法处理与locale相关的数据会产生意想不到的后果。编程语言的标示符、协议关键字以及HTML标签通常会指定Locale.ENGLISH作为一个特定的locale。当改变默认的locale的时候,很有可能使数据绕过检查,从而改变locale相关方法的行为。比如,当把一个字符串转换为大写字符时,可认为它是合法的,然而,当把它接着转换回小写字符时,可能就会产生黑名单字符串。
任何一个程序调用locale相关方法时,如果使用非受信数据,必须显式指明使用这些方法的locale。
2.10.1 不符合规则的代码示例
这个代码示例中使用了locale相关的String.toUpperCase()?方法来将HTML标签转换为大写字符。在英文locale中,会将“title” 转换为 “TITLE”,在土耳其locale中,会将“title” 转换为 “T?TLE”,其中的“?”是拉丁文字母“I”,它在字符上是有一个点的[API 2006]。
"title".toUpperCase();
2.10.2 符合规则的方案(显式的locale)
该方案显式地将locale设置为英文,从而避免产生意想不到的问题。
"title".toUpperCase(Locale.ENGLISH);
这条规则同样适用于?String.equalsIgnoreCase()方法。
2.10.3 符合规则的方案(默认locale)
符合规则的方案在对字符串数据进行处理之前,把默认的locale设置为English。
Locale.setDefault(Locale.ENGLISH);
"title".toUpperCase();
2.10.4 风险评估
如果没有指定合适的locale,那么当使用locale相关方法处理与locale相关的数据时,会产生意外的行为。