墙角下的toLowerCase()

来源:互联网 发布:软件分析报告 编辑:程序博客网 时间:2024/05/01 09:16

Turkey对国际化开发和测试人员应该都不算陌生,在G11n的世界中,他一直都属于那种需要被“重点照顾”的同学。但究竟怎么个特殊法呢?我先来讲述一个亲身经历的往事。

 

故事就发生在不久前,首先测试人员安装AUT在TR win server上,紧接着在browser中键入需要访问的URL,点击Access试图访问AUT。然而奇迹就在此刻不期而遇了……测试人员在等待了很长时间后,页面上除了一个不停loading的转盘外,什么都没有发生,整个登陆过程被hang住!而该情况在其他OS上并不复现。

 

问题何在?TR缘何要被重点照顾?头号嫌犯的影像其实已在脑中浮现了出来,于是默默地在IDE中搜索toLowerCase& toUpperCase……

 

果不其然,惯犯已落网,示例代码如下。

public enum OS {   WIN32, WIN64,WINMOBILE, LINUX64, LINUX32, ANDROID, IOS, CHROMEOS, MAC, UNKNOWN;    public StringtoString() {      returnname().toLowerCase();   }}

到这里,我们已经看出该问题的根源就在于在toLowerCase函数在TR locale下对字符“i”的处理异于其他。而好巧不巧的是,几个主流操作系统又都不约而同的包含了字母i,Windows,Linux,IOS,Android。于是乎,问题不可避免的发生了。

 

究竟TR对于i的处理有何诡异?看看下面这段代码的输入你应该就了然啦。

String uos = "WIN64";String los = "linux64";Locale loc = Locale.forLanguageTag("tr-TR"); System.out.println(uos.toLowerCase(loc));System.out.println(uos.toLowerCase(Locale.ROOT));System.out.println(los.toUpperCase(loc));System.out.println(los.toUpperCase(Locale.ROOT));

wın64win64LİNUX64LINUX64

最终在toLowerCase中明示Locale,修改代码为return name().toLowerCase(Locale.ROOT); 问题解决。回顾问题本身,其实是一处很小的代码修改,但却险些造成了release delay,看来要实现一个国际化的软件产品,尤其需要注意这些犄角旮旯中的暗器哦,正如墙角下的toLowerCase。

1 0
原创粉丝点击