收到一个客户报来的bug,说自己在创建某个component时,一旦命名中包含了ß(例如UEMENß),该创建功能会导致失败,删除掉ß后该功能正常运行。不少资深的测试和开发留言说—— ß是一个非常tricky的字符,很多第三方库对其支持都不好,其他产品也有类似问题吗,在release notes务必加上一句告知用户。
ß当真如此神秘?怎么就引得无数英雄尽折腰呢?为何那么多第三方库对其支持都不好呢?一起看看这段代码片段吧。
Stringb = "ß";
Localeloc = Locale.forLanguageTag("en-US");
System.out.println(b.toLowerCase(loc));
System.out.println(b.toUpperCase(loc));
打印结果如下:
ß
SS
发现了什么吗?不会是眼花了吧,更换locale为tr-TR再试,结果没有任何变化。原来根源在这里,而本例中,同样因为调用了toUpperCase()导致ß变成了SS,而随后的检验过程自然找不到期望的ß,操作失败也随着而来。
int lastCommaIndex =distinguishedName.toUpperCase().indexOf(this.distinguishedName.toUpperCase()) -1;
戏法这东西,看上去高大上,而一旦捅破了感觉也就不过如此,再蹊跷的Bug也同理可证。背后的玄机已然曝光,以后做国际化开发时需要调用toUpperCase,大家还得小心为妙哦。