JavaScript używa UTF-16 (source) zarządzać sznurki.
W UTF-16 jest 1 121 064 możliwe znaki. Teraz każda postać używa code points do reprezentacji (*). W UTF-16 jeden kod-punkt wykorzystuje dwa bajty (16 bitów) do zapisania. Oznacza to, że z jednym punktem kodowym możesz mieć różne znaki.
Oznacza to, że niektóre znaki muszą być reprezentowane za pomocą dwóch punktów kodowych.
String.length() zwraca liczbę jednostek kodu w łańcuchu, a nie liczbę znaków.
MDN wyjaśnia dość dobrze rzeczy na stronie o String.length()
Ta właściwość zwraca liczbę jednostek kod w ciąg. UTF-16, format ciągu używany przez JavaScript, używa pojedynczej 16-bitowej jednostki kodu do reprezentowania najczęściej występujących znaków, ale musi używać dwóch jednostek kodu dla rzadziej używanych znaków, więc możliwe jest, że wartość zwrócona przez długość do nie pasuje do faktycznej liczby znaków w ciągu.
(*): Właściwie kilka znaków, w zakresie 010000 - 03FFFF i 040000 - 10FFFF może używać maksymalnie 4 bajty (32 bity) na punkt kodowy, ale to nie zmienia odpowiedź : niektóre znaki wymagają więcej niż 2 bajtów do przedstawienia, więc potrzebują więcej niż 1 punktu kodowego.
Oznacza to, że niektóre znaki, które wymagają więcej niż 16 bitów, mają mimo wszystko długość 1. Jak 0x03FFFF, potrzebuje 21 bitów, ale wykorzystuje tylko jedną jednostkę kodu w UTF-16, więc jego String.length jest 1.
console.log(String.fromCharCode(0x03FFFF).length)
Zobacz http: // developer .teradata.com/blog/jasonstrimpel/2011/11/javascript-string-length-and-internationalizing-web-applications. – str