Tach!
Ein Blob bringt da Klarheit wieviele bytes es sind:
var s = String.fromCharCode(0xA); var b = new Blob([s]); console.log(b.size); // 1 byte
also keine 16 bit sondern nur 8. Wenn es UTF16 wäre, hätte der Blob eine Länge von 2 bytes!
Falsche Messmethode, falsche Schlussfolgerung. Eine Aussage zum String kann mit dem Blob nicht getroffen werden, denn der Blob-Konstruktor kodiert den String als UTF-8.
MDN zum Blob-Konstruktor: „Parameters: array is an Array of ArrayBuffer, ArrayBufferView, Blob, DOMString objects, or a mix of any of such objects, that will be put inside the Blob. DOMStrings are encoded as UTF-8.“
Der letzte Satz ist ein bisschen uneindeutig. Folgt man dem dortigen Link zur Spezifikation findet man darin „Append the result of UTF-8 encoding s to bytes.“ Das heißt also nicht, dass DOMStrings UTF-8-kodiert sind, sondern dass das Ergebnis der UTF-8-Kodierung von s (eines der Argumente des o.g. Arrays) zum Ergebnis (bytes: „Let bytes be an empty sequence of bytes“) hinzugefügt wird.
MDN zu DOMString: „DOMString is a UTF-16 String. As JavaScript already uses such strings, DOMString is mapped directly to a String.“
Web IDL zu DOMString (wobei IDL für interface description language steht. Damit werden die Schnittstellen beschrieben, die der Browser zur Verfügung stellt, also der Teil, mit dem Javascript-Code interagiert, wenn man Dinge außerhalb des Javascript-Wirkungsbereiches zu erledigen hat): „The DOMString type corresponds to the set of all possible sequences of code units. Such sequences are commonly interpreted as UTF-16 encoded strings [RFC2781] although this is not required.“
Eine Definition von „code unit“ findet man im Glossar vom Unicode-Konsortium: „The minimal bit combination that can represent a unit of encoded text for processing or interchange. The Unicode Standard uses 8-bit code units in the UTF-8 encoding form, 16-bit code units in the UTF-16 encoding form, and 32-bit code units in the UTF-32 encoding form.“
Es hängt also von der konkreten Implementation der Javascript-Engine ab, was da intern verwendet wird. Meist ist es wohl UTF-16.
Es bleibt nach wie vor dabei, dass diese Interna für das Arbeiten mit Javascript nicht weiter relevant sind (wenn man nicht gerade einen Schichtensalat zu produzieren versucht). Was an welcher Stelle nach außen hin sichtbar ist, hängt davon ab, was das jeweilige Objekt/Funktion/Methode daraus macht, das man verwendet, und verwenden muss, um mit der Außenwelt zu kommunizieren.
dedlfix.