天天看點

都是ß惹的禍

收到一個客戶報來的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,大家還得小心為妙哦。