Signatur
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
"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);
}
});
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));
});
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);
}
};
// 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()undwrite()erfordern außerdem eine Nutzergeste und die Berechtigung"nfc". - Rufe
encodingnur beirecordType === "text"auf, weil der Wert sonstnullist.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
TypeErrorausgelö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".