#!perl -T ## no critic (TidyCode)

use strict;
use warnings;
use charnames ':full';

our $VERSION = 0;

require Data::Dumper; # to visualize output only
require Locale::MO::File;

binmode STDOUT, ':encoding(UTF-8)';
my $filename = '23_big_endian_utf-8.mo';

# The content of the "messages" array reference is first sorted and then written.
# The transferred "messages" array reference remains unchanged.
# A given file handle is used but not closed.
# This example shows you how to handle encoding and newline.
Locale::MO::File
    ->new(
        filename      => $filename,
        encoding      => 'UTF-8', # encode from unicode chars to UTF-8 bytes
        newline       => "\r\n",  # change all newlines in messages to CRLF
        is_big_endian => 1,
        messages      => [
            {
                msgid  => q{},
                msgstr => <<'EOT',
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Plural-Forms: nplurals=2; plural=n != 1;
EOT
            },
            {
                msgid  => "11\N{LATIN SMALL LETTER E WITH DIAERESIS}",
                msgstr => "12\N{LATIN SMALL LETTER U WITH DIAERESIS}",
            },
            {
                msgctxt => "21\N{LATIN SMALL LETTER A WITH DIAERESIS}",
                msgid   => "22\N{LATIN SMALL LETTER E WITH DIAERESIS}",
                msgstr  => "23\N{LATIN SMALL LETTER U WITH DIAERESIS}",
            },
            {
                msgid         => "31\N{LATIN SMALL LETTER E WITH DIAERESIS}",
                msgid_plural  => "32\N{LATIN SMALL LETTER O WITH DIAERESIS}",
                msgstr_plural => [
                    "33\N{LATIN SMALL LETTER U WITH DIAERESIS}",
                    "34\N{LATIN SMALL LETTER U WITH DIAERESIS}",
                ],
            },
            {
                msgctxt       => "41\N{LATIN SMALL LETTER A WITH DIAERESIS}",
                msgid         => "42\N{LATIN SMALL LETTER E WITH DIAERESIS}",
                msgid_plural  => "43\N{LATIN SMALL LETTER O WITH DIAERESIS}",
                msgstr_plural => [
                    "44\N{LATIN SMALL LETTER U WITH DIAERESIS}",
                    "45\N{LATIN SMALL LETTER U WITH DIAERESIS}",
                ],
            },
        ],
    )
    ->write_file;

my $messages_result = Locale::MO::File
    ->new(
        filename => $filename,
        encoding => 'UTF-8', # decode from UTF-8 bytes to unicode chars
        newline  => "\n",    # change all newlines in messages to \n
    )
    ->read_file
    ->get_messages;

() = print {*STDOUT} Data::Dumper ## no critic (LongChainsOfMethodCalls)
    ->new([$messages_result], [qw(messages_result)])
    ->Indent(1)
    ->Quotekeys(0)
    ->Sortkeys(1)
    ->Useperl(1)
    ->Dump;

# $Id: 12_build_header.pl 513 2010-07-29 15:16:57Z steffenw $

__END__

Output:

$messages_result = [
  {
    msgid => '',
    msgstr => 'MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Plural-Forms: nplurals=2; plural=n != 1;
'
  },
  {
    msgid => '11\xc3\xab',
    msgstr => '12\xc3\xbc'
  },
  {
    msgctxt => '21\xc3\xa4',
    msgid => '22\xc3\xab',
    msgstr => '23\xc3\xbc'
  },
  {
    msgid => '31\xc3\xab',
    msgid_plural => '32\xc3\xb6',
    msgstr_plural => [
      '33\xc3\xbc',
      '34\xc3\xbc'
    ]
  },
  {
    msgctxt => '41\xc3\xa4',
    msgid => '42\xc3\xab',
    msgid_plural => '43\xc3\xb6',
    msgstr_plural => [
      '44\xc3\xbc',
      '45\xc3\xbc'
    ]
  }
];
