Welche Codierung wird von „String.fromCharCode“ verwendet?JavaScript

Javascript-Forum
Guest
 Welche Codierung wird von „String.fromCharCode“ verwendet?

Post by Guest »

Ich verwende btoa, um ein Uint8Array in eine Basis-64-Zeichenfolge zu kodieren. Und ich bin auf einen seltsamen Fall gestoßen. Das funktioniert:

Code: Select all

export function toBase64(data: Uint8Array): string {
return btoa(String.fromCharCode(...data))
}
Während dies nicht der Fall ist (

Code: Select all

btoa
beschwert sich oft über ein unbekanntes Zeichen):

Code: Select all

export function toBase64(data: Uint8Array): string {
return btoa(new TextDecoder('latin1').decode(data))
}
Frage
Welche Codierung sollte ich mit TextDecoder verwenden, um dieselbe Zeichenfolge wie über fromCharCode zu erzeugen?
Hintergrund
Wenn man verschiedene Dokumentationen zusammenfasst, sollte Folgendes zutreffen:
  • Code: Select all

    btoa
    erwartet eine latin1-Kodierung
  • Code: Select all

    String.fromCharCode
    konvertiert einzelne Ganzzahlen in das entsprechende utf16-Zeichen
  • dabei überlappen sich die ersten 256 Zeichen von latin1 und utf16
Test
Bei einigen Experimenten wird klar, dass die beiden Ansätze unterschiedliche Zeichenfolgen ergeben. Mit diesem Setup:

Code: Select all

const array = Array.from({ length: 256 }, (_, i) => I);
const d = new Uint8Array(array);
Läuft:

Code: Select all

String.fromCharCode(...d)
ergibt

Code: Select all

\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !"#$%&\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
Während ausgeführt wird:

Code: Select all

(new TextDecoder('latin1')).decode(d)
ergibt

Code: Select all

\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !"#$%&\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F€\x81‚ƒ„…†‡ˆ‰Š‹Œ\x8DŽ\x8F\x90‘’“”•–—˜™š›œ\x9DžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
Wo sie sich im Bereich 7F-9F erheblich unterscheiden (aus Gründen der Übersichtlichkeit unten kopiert)

Code: Select all

\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F

\x7F€\x81‚ƒ„…†‡ˆ‰Š‹Œ\x8DŽ\x8F\x90‘’“”•–—˜™š›œ\x9DžŸ

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post