2015-06-10 35 views
2

威爾JavaScript的字符串原型法toUpperCase()在每個UTF-8支持的語言/字符集提供自然預期的結果?Javascript的toUpperCase()語言安全嗎?

我試着簡化中國,韓國,泰米爾語,日語和西里爾和結果似乎合理爲止。我可以依賴於語言安全的方法嗎?

實施例:

"イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス".toUpperCase() 
> "イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス" 

編輯:正如@Quentin指出的那樣,還存在一個String.prototype.toLocaleUpperCase()這可能甚至是「安全」的使用,但我也有支持IE 8以上,以及基於Webkit的瀏覽器。由於它是ECMAScript 3標準的一部分,它應該在所有瀏覽器上都可用,對吧?

有誰知道在哪裏使用它提供自然意想不到的結果任何情況下?

+2

「不」是一個安全的賭注。有很多UTF-8字符的語言,其中很多甚至沒有大寫或小寫字符的概念。 – tadman

+4

另請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase – Quentin

+0

小問題:請禮貌地通知您的Windows XP用戶,如果沒有安全更新,他們是(98 %可能)是使網絡工程師的工作更加困難的全球僵屍網絡的一部分。 – Katana314

回答

5

你有什麼期望?

JavaScript的toUpperCase()方法應該使用「區域設置不變大寫映射」由Unicode標準所定義的。所以,基本上,在所有情況下,"i".toUpperCase()應該是I。在區域不變大寫映射由多個字母組成的情況下,大多數瀏覽器不會正確地區分大小寫,例如"ß".toUpperCase()通常不是SS

此外,還有一些具有比世界其他地區不同的大寫規則的語言環境中,最顯着的例子是土耳其,在那裏的i大寫版本是İ(反之亦然)和I小寫版本是ı(反之亦然)。

如果您想要這種行爲,您需要一個設置爲土耳其語語言環境的瀏覽器,並且您必須使用toLocaleUpperCase()方法。

另請注意,有些書寫系統有第三種情況,即「標題大小寫」,當您要「大寫」它時,它應用於單詞的第一個字母。這也由Unicode標準定義(例如,連字nj的標題情況爲Nj,而大寫爲NJ),但是(據我所知)對於JavaScript不可用。因此,如果您嘗試使用substringtoUpperCase來表示某個詞的大寫,請在極少數情況下指出它是錯誤的。

2

是。從the spec

[返回]字符串,其中每個字符是Unicode的 [輸入]或[輸入]的 實際對應的字符的如果沒有Unicode大寫 等效對應的字符的大寫等效存在。

出於此操作的目的, 字符串的16位代碼單元被視爲Unicode基本多語言 平面中的代碼點。替代碼點直接從[輸入到 輸出]傳輸,無需任何映射。

結果必須根據在 Unicode字符數據庫中的情況下的映射來導出(此明確地不僅包括 UnicodeData.txt文件,而且還SpecialCasings.txt文件 伴隨着它以Unicode 2.1.8和後來)。

因此,儘管這可能不是完全匹配您的語言預期(因爲許多語言都使用相同的字符,但不一定以同樣的方式),如Unicode字符數據庫指定它無疑提供自然預期的結果。

+2

因此,對於代理對,它甚至被定義爲錯誤的(是的,代理對也有大寫映射,例如http://decodeunicode.org/en/u+10428/properties有大寫映射http:// decodeunicode。組織/ EN/U + 10400) – mihi