ANNOUNCEMENT

Encoding::Emacs v0.1.0 - Announcement

Reddit Post (r/rakulang)

Title: [ANN] Encoding::Emacs v0.1.0 - 80+ legacy character encodings for Raku

Body:

I'm excited to announce the release of Encoding::Emacs, a new module that brings 80+ legacy character encodings to Raku!

What is it?

Encoding::Emacs auto-generates Raku encoding classes from Emacs' MULE (Multilingual Environment) charset definitions. It provides comprehensive support for legacy encodings that many developers still need when working with older files and systems.

Supported Encodings

  • ISO-8859 series (2-9, 14, 15) - Latin, Cyrillic, Greek, Hebrew, Arabic, Turkish, etc.

  • Windows codepages (CP1250-1258) - All major Windows encodings

  • DOS codepages (CP437, CP850-866) - Classic DOS encodings with box-drawing

  • KOI8 variants (KOI8-R, KOI8-U, KOI8-T) - Russian, Ukrainian, Tajik

  • IBM EBCDIC - Mainframe encodings

  • Mac Roman, HP Roman8, VISCII - And 50+ more!

Features

βœ… Full encode/decode support - Convert between bytes and Unicodeβœ… O(1) performance - Hash-based lookups for fast conversionβœ… Lazy loading - Encodings load on-demand, minimal memory footprintβœ… Production ready - 52 passing tests, validated on real-world dataβœ… Easy to use - Simple, idiomatic Raku API

Installation

zef install Encoding::Emacs

Quick Example

use Encoding::Emacs::Full::Cp850;

# Decode DOS CP850 bytes
my $bytes = Buf.new(0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x9D);
my $decoder = Encoding::Emacs::Full::Cp850.decoder;
say $decoder.consume($bytes);  # Output: Hello Ø

# Encode Unicode to CP850
my $encoder = Encoding::Emacs::Full::Cp850.encoder;
my $encoded = $encoder.encode-chars("Grüß Gott");
say $encoded;  # Buf with proper CP850 bytes

Why This Matters

Legacy encoding support is crucial for:

  • Working with old database dumps

  • Processing files from legacy systems

  • Converting historical documents

  • Interfacing with mainframes and industrial systems

  • Migrating data to Unicode

Instead of maintaining encoding tables manually, Encoding::Emacs generates them automatically from Emacs' battle-tested MULE definitions.

Links

Technical Highlights

The module uses:

  • Raku Grammar for parsing Emacs Lisp charset definitions

  • Template-based code generation for creating 80+ encoding classes

  • Runtime mapping loader with caching for performance

  • Anonymous inner classes implementing Raku's Encoding roles

All encoder/decoder classes are auto-generated, ensuring consistency and making it easy to add new encodings.

Future Plans

  • Multi-byte encoding support (CJK)

  • Integration with Raku's Encoding::Registry

  • Performance optimizations for large files

  • Additional encoding families

Feedback Welcome!

This is v0.1.0 - I'd love to hear your feedback, bug reports, and feature requests!

Enjoy! πŸš€

Twitter/X Post

πŸŽ‰ Just released Encoding::Emacs v0.1.0 for #RakuLang!

80+ legacy character encodings (ISO-8859, Windows CP, DOS CP, KOI8, EBCDIC) auto-generated from Emacs MULE definitions.

βœ… Full encode/decode βœ… O(1) hash lookups βœ… 52 passing tests

zef install Encoding::Emacs

https://github.com/winfredraj/encoding-emacs

#Raku #Unicode #Programming

IRC/Discord Announcement

Hey everyone! πŸ‘‹

Just published Encoding::Emacs v0.1.0 to the ecosystem!

It provides 80+ legacy character encodings (ISO-8859, Windows/DOS codepages, KOI8, EBCDIC, etc.) auto-generated from Emacs MULE definitions.

Perfect for working with legacy files and systems.

Install: zef install Encoding::Emacs GitHub: https://github.com/winfredraj/encoding-emacs

Feedback welcome! πŸŽ‰

Mailing List Post (raku-users)

Subject: [ANN] Encoding::Emacs v0.1.0 - Legacy character encodings for Raku

Hi everyone,

I'm pleased to announce the release of Encoding::Emacs v0.1.0, now available on the Raku ecosystem.

What it does:

Encoding::Emacs provides comprehensive support for 80+ legacy character encodings by auto-generating Raku encoding classes from Emacs' MULE (Multilingual Environment) charset definitions.

Supported encoding families:

  • ISO-8859 series (Latin-1 through Latin-10)

  • Windows codepages (CP1250-1258)

  • DOS codepages (CP437, CP850-866, etc.)

  • KOI8 variants (KOI8-R, KOI8-U, KOI8-T)

  • IBM EBCDIC encodings

  • Mac Roman, HP Roman8, VISCII, and more

Key features:

  • Full bidirectional encode/decode support

  • O(1) hash-based lookups for performance

  • Lazy loading with caching

  • 52 comprehensive tests

  • Validated on real-world legacy files

Installation:

zef install Encoding::Emacs

Example usage:

use Encoding::Emacs::Full::Iso_8859_5;  # Cyrillic

my $bytes = slurp("old-file.txt", :bin);
my $decoder = Encoding::Emacs::Full::Iso_8859_5.decoder;
my $text = $decoder.consume($bytes);
say $text;  # Properly decoded Russian text

Links:

Why Emacs MULE?

Emacs' MULE system has decades of battle-testing and comprehensive coverage of legacy encodings. By auto-generating from these definitions, we get reliable, well-tested encoding tables without manual maintenance.

Feedback, bug reports, and contributions are very welcome!

Best regards, Winfred Raj

Encoding::Emacs v0.1.5.1

Auto-generated character encodings from Emacs MULE definitions - 80+ legacy encodings (ISO-8859, Windows CP, DOS CP, KOI8, EBCDIC, etc.)

Authors

  • Winfred Raj

License

Artistic-2.0

Dependencies

Test Dependencies

Provides

  • Encoding::Emacs::Full::Alternativnyj
  • Encoding::Emacs::Full::Control_1
  • Encoding::Emacs::Full::Cp00858
  • Encoding::Emacs::Full::Cp1125
  • Encoding::Emacs::Full::Cp1250
  • Encoding::Emacs::Full::Cp1251
  • Encoding::Emacs::Full::Cp1252
  • Encoding::Emacs::Full::Cp1253
  • Encoding::Emacs::Full::Cp1254
  • Encoding::Emacs::Full::Cp1255
  • Encoding::Emacs::Full::Cp1256
  • Encoding::Emacs::Full::Cp1257
  • Encoding::Emacs::Full::Cp1258
  • Encoding::Emacs::Full::Cp437
  • Encoding::Emacs::Full::Cp720
  • Encoding::Emacs::Full::Cp737
  • Encoding::Emacs::Full::Cp775
  • Encoding::Emacs::Full::Cp850
  • Encoding::Emacs::Full::Cp851
  • Encoding::Emacs::Full::Cp852
  • Encoding::Emacs::Full::Cp855
  • Encoding::Emacs::Full::Cp857
  • Encoding::Emacs::Full::Cp858
  • Encoding::Emacs::Full::Cp860
  • Encoding::Emacs::Full::Cp861
  • Encoding::Emacs::Full::Cp862
  • Encoding::Emacs::Full::Cp863
  • Encoding::Emacs::Full::Cp864
  • Encoding::Emacs::Full::Cp865
  • Encoding::Emacs::Full::Cp866
  • Encoding::Emacs::Full::Cp866u
  • Encoding::Emacs::Full::Cp869
  • Encoding::Emacs::Full::Cp874
  • Encoding::Emacs::Full::Georgian_Academy
  • Encoding::Emacs::Full::Georgian_Ps
  • Encoding::Emacs::Full::Hp_Roman8
  • Encoding::Emacs::Full::Ibm850
  • Encoding::Emacs::Full::Ibm866
  • Encoding::Emacs::Full::Iso_8859_14
  • Encoding::Emacs::Full::Iso_8859_15
  • Encoding::Emacs::Full::Iso_8859_2
  • Encoding::Emacs::Full::Iso_8859_3
  • Encoding::Emacs::Full::Iso_8859_4
  • Encoding::Emacs::Full::Iso_8859_5
  • Encoding::Emacs::Full::Iso_8859_6
  • Encoding::Emacs::Full::Iso_8859_7
  • Encoding::Emacs::Full::Iso_8859_8
  • Encoding::Emacs::Full::Iso_8859_9
  • Encoding::Emacs::Full::Japanese_Jisx0213_A
  • Encoding::Emacs::Full::Koi8
  • Encoding::Emacs::Full::Koi8_R
  • Encoding::Emacs::Full::Koi8_T
  • Encoding::Emacs::Full::Koi8_U
  • Encoding::Emacs::Full::Latin_Iso8859_1
  • Encoding::Emacs::Full::Mac_Roman
  • Encoding::Emacs::Full::Mik
  • Encoding::Emacs::Full::Next
  • Encoding::Emacs::Full::Ruscii
  • Encoding::Emacs::Full::Tcvn_5712
  • Encoding::Emacs::Full::Unicode_Bmp
  • Encoding::Emacs::Full::Viscii
  • Encoding::Emacs::Full::Vscii
  • Encoding::Emacs::Full::Vscii_2
  • Encoding::Emacs::Full::Windows_1250
  • Encoding::Emacs::Full::Windows_1251
  • Encoding::Emacs::Full::Windows_1252
  • Encoding::Emacs::Full::Windows_1253
  • Encoding::Emacs::Full::Windows_1254
  • Encoding::Emacs::Full::Windows_1255
  • Encoding::Emacs::Full::Windows_1256
  • Encoding::Emacs::Full::Windows_1257
  • Encoding::Emacs::Full::Windows_1258
  • Encoding::Emacs::Generator
  • Encoding::Emacs::MappingTable
  • Encoding::Emacs::Parser
  • Encoding::Emacs::Registry

Documentation

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.