Start · Sprachen · JavaScript · Referenz · NDEFRecord.encoding

NDEFRecord.encoding

Eigenschaft

Gibt die Zeichenkodierung der textuellen Nutzlast eines <code>NDEFRecord</code> zurück (z. B. <code>"utf-8"</code>) oder <code>null</code>, wenn der Datensatz kein Text ist.

seit JavaScript Experimentell: Chrome für Android 89+ (Web NFC) Kategorie: webapi

Signatur

NDEFRecord.encoding

Beschreibung

Die schreibgeschützte Eigenschaft encoding der Schnittstelle NDEFRecord gehört zur Web NFC API. Sie gibt an, mit welcher Zeichenkodierung die Nutzlast eines Text-Datensatzes (recordType === "text") gespeichert ist. Typische Werte sind "utf-8" und "utf-16". Die Spezifikation erlaubt zusätzlich "utf-16be" und "utf-16le".

Nützlich ist die Eigenschaft vor allem beim Lesen von NFC-Tags: Die Nutzlast in record.data liegt nur als DataView mit Rohbytes vor. Übergibt man record.encoding direkt an einen TextDecoder, wird der Text in der richtigen Kodierung dekodiert, auch wenn das Tag in UTF-16 beschrieben wurde.

Bei Datensätzen ohne Text, etwa "url", "mime", "empty" oder externen Typen, ist der Wert null. Beim Schreiben legt man die Kodierung über die Option encoding im Datensatz-Objekt fest, das man an NDEFReader.write() übergibt. Die Eigenschaft selbst kann man nicht ändern.

Rückgabewert

Typ
string | null
Beschreibung
Die Kodierung der Text-Nutzlast ("utf-8", "utf-16", "utf-16be" oder "utf-16le") oder null, wenn der Datensatz kein Text-Datensatz ist.

Beispiele

Text-Datensätze eines NFC-Tags richtig dekodieren

const scanButton = document.querySelector('#scan');

scanButton.addEventListener('click', async () => {
  try {
    const reader = new NDEFReader();
    await reader.scan(); // braucht eine Nutzergeste und die NFC-Berechtigung

    reader.addEventListener('reading', ({ message, serialNumber }) => {
      console.log(`Tag erkannt: ${serialNumber}`);
      for (const record of message.records) {
        if (record.recordType !== 'text') continue;
        // encoding direkt an den TextDecoder übergeben
        const decoder = new TextDecoder(record.encoding);
        console.log(`Sprache: ${record.lang}, Kodierung: ${record.encoding}`);
        console.log(`Text: ${decoder.decode(record.data)}`);
      }
    });
  } catch (err) {
    console.error('NFC nicht verfügbar:', err);
  }
});
Tag erkannt: 04:a2:3b:c1:5e:61:80 Sprache: de, Kodierung: utf-8 Text: Hallo NFC

Text in UTF-16 auf ein Tag schreiben

const writeUtf16 = async () => {
  const writer = new NDEFReader();
  await writer.write({
    records: [
      {
        recordType: 'text',
        lang: 'ja',
        encoding: 'utf-16',
        data: 'こんにちは'
      }
    ]
  });
  console.log('Tag beschrieben (UTF-16).');
};

document.querySelector('#write').addEventListener('click', () => {
  writeUtf16().catch((err) => console.error('Schreiben fehlgeschlagen:', err));
});
Tag beschrieben (UTF-16).

encoding bei Datensätzen ohne Text

const reader = new NDEFReader();
await reader.scan();

reader.onreading = ({ message }) => {
  for (const record of message.records) {
    console.log(record.recordType, '→', record.encoding);
  }
};
text → utf-8 url → null mime → null

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Web NFC ist experimentell und wird derzeit nur von Chrome für Android (ab Version 89) unterstützt. Firefox, Safari und Desktop-Browser unterstützen die API nicht. Prüfe vorher mit 'NDEFReader' in window, ob sie verfügbar ist.
  • Die API steht nur in einem sicheren Kontext (HTTPS) und nur im Frame der obersten Ebene zur Verfügung. scan() und write() erfordern außerdem eine Nutzergeste und die Berechtigung "nfc".
  • Rufe encoding nur bei recordType === "text" auf, weil der Wert sonst null ist. new TextDecoder(null) fällt zwar stillschweigend auf UTF-8 zurück, kann aber bei Binärdaten wie MIME-Datensätzen unsinnige Ergebnisse liefern.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung hat keine Wirkung (im Strict Mode wird ein TypeError ausgelöst). Die Kodierung wird beim Schreiben über das Datensatz-Objekt festgelegt.
  • Laut NDEF-Standard kennt ein Text-Datensatz nur UTF-8 und UTF-16 (ein Status-Bit). Beim Lesen erhältst du deshalb in der Regel "utf-8" oder "utf-16".