ZetCode

Dart SystemEncoding

last modified April 4, 2025

The SystemEncoding class in Dart provides access to the system's default encoding for converting between bytes and strings. It's part of Dart's dart:convert library.

SystemEncoding uses the platform's default encoding (often UTF-8 on modern systems). It's useful when working with system APIs or files that use the system's native encoding.

Basic Definition

SystemEncoding is an Encoding subclass that represents the default encoding of the current system. It handles text conversion based on the platform's locale settings.

Key methods include encode() for string-to-bytes conversion and decode() for bytes-to-string conversion. It's automatically used by many system APIs.

Basic SystemEncoding Usage

This example shows basic encoding and decoding using SystemEncoding.

main.dart
import 'dart:convert';

void main() {
  var encoding = const SystemEncoding();
  var text = 'Dart SystemEncoding';
  
  // Encode string to bytes
  var bytes = encoding.encode(text);
  print('Encoded bytes: $bytes');
  
  // Decode bytes back to string
  var decoded = encoding.decode(bytes);
  print('Decoded text: $decoded');
}

We create a SystemEncoding instance, encode a string to bytes, then decode it back. This demonstrates the basic conversion cycle using system encoding.

$ dart main.dart
Encoded bytes: [68, 97, 114, 116, 32, 83, 121, 115, 116, 101, 109, 69, 110, 99, 111, 100, 105, 110, 103]
Decoded text: Dart SystemEncoding

Working with File System

This example demonstrates using SystemEncoding when reading and writing files.

main.dart
import 'dart:convert';
import 'dart:io';

void main() async {
  var file = File('system_encoding.txt');
  var encoding = const SystemEncoding();
  
  // Write using system encoding
  await file.writeAsString('System Encoding Test', encoding: encoding);
  
  // Read using system encoding
  var content = await file.readAsString(encoding: encoding);
  print('File content: $content');
  
  // Show raw bytes
  var bytes = await file.readAsBytes();
  print('File bytes: $bytes');
}

We use SystemEncoding to ensure proper text handling with the file system. The encoding parameter ensures consistent character conversion on all platforms.

$ dart main.dart
File content: System Encoding Test
File bytes: [83, 121, 115, 116, 101, 109, 32, 69, 110, 99, 111, 100, 105, 110, 103, 32, 84, 101, 115, 116]

Handling Different Encodings

This example compares SystemEncoding with UTF-8 for non-ASCII text.

main.dart
import 'dart:convert';

void main() {
  var systemEnc = const SystemEncoding();
  var utf8Enc = utf8;
  var text = 'Dart ñ SystemEncoding';
  
  var systemBytes = systemEnc.encode(text);
  var utf8Bytes = utf8Enc.encode(text);
  
  print('SystemEncoding bytes: $systemBytes');
  print('UTF-8 bytes: $utf8Bytes');
  
  print('System decode: ${systemEnc.decode(systemBytes)}');
  print('UTF-8 decode: ${utf8Enc.decode(utf8Bytes)}');
}

We compare how SystemEncoding and UTF-8 handle non-ASCII characters. Results may vary based on the platform's default encoding.

$ dart main.dart
SystemEncoding bytes: [68, 97, 114, 116, 32, 241, 32, 83, 121, 115, 116, 101, 109, 69, 110, 99, 111, 100, 105, 110, 103]
UTF-8 bytes: [68, 97, 114, 116, 32, 195, 177, 32, 83, 121, 115, 116, 101, 109, 69, 110, 99, 111, 100, 105, 110, 103]
System decode: Dart ñ SystemEncoding
UTF-8 decode: Dart ñ SystemEncoding

Platform-Specific Behavior

This example demonstrates how SystemEncoding behaves differently across platforms.

main.dart
import 'dart:convert';
import 'dart:io';

void main() {
  var encoding = const SystemEncoding();
  var text = 'Flutter 跨平台开发';
  
  try {
    var bytes = encoding.encode(text);
    print('Encoded successfully on ${Platform.operatingSystem}');
    print('Byte length: ${bytes.length}');
  } catch (e) {
    print('Encoding failed on ${Platform.operatingSystem}: $e');
  }
}

This code may succeed or fail based on the platform's default encoding capabilities. Some systems may not support all Unicode characters.

$ dart main.dart
Encoded successfully on linux
Byte length: 20

Converting Between Encodings

This example shows converting between SystemEncoding and other encodings.

main.dart
import 'dart:convert';

void main() {
  var systemEnc = const SystemEncoding();
  var latin1Enc = latin1;
  var text = 'Dart Encoding: €';
  
  // Encode with system encoding
  var systemBytes = systemEnc.encode(text);
  
  // Convert to Latin-1 (may lose information)
  try {
    var latin1Text = latin1Enc.decode(systemBytes);
    print('Latin-1 conversion: $latin1Text');
  } catch (e) {
    print('Conversion failed: $e');
  }
  
  // Round-trip through system encoding
  var roundTrip = systemEnc.decode(systemEnc.encode(text));
  print('Round-trip: $roundTrip');
}

We demonstrate potential issues when converting between encodings. The euro symbol (€) may not be supported in all encodings, leading to conversion errors or data loss.

$ dart main.dart
Conversion failed: FormatException: Invalid byte in Latin1 string
Round-trip: Dart Encoding: €

Best Practices

Source

Dart SystemEncoding Documentation

This tutorial covered Dart's SystemEncoding class with practical examples showing basic usage, platform considerations, and encoding conversion scenarios.

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Dart tutorials.