This is encoded in UTF-8 and Quoted Printable. If decoded, these codes will explain themselves.
Note: U+3099 and U+309A are the combining "dakuten" and "han-dakuten". #!perl use 5.008; use utf8; use Unicode::Normalize qw(:normalize); sub composeKana { (my $str =3D shift) =3D~ s/([\p{InHiragana}\p{InKatakana}]+)/compose($1)/eg; return $str; } sub normalHalfFull { (my $str =3D shift) =3D~ s/(\p{InHalfwidthAndFullwidthForms}+)/NFKC($1)/eg; return $str; } print composeKana("=E3=81=8B\x{3099}=E3=83=9B\x{309A}=E3=82=9D\x{3099}") eq "=E3=81=8C=E3=83=9D=E3=82=9E" ? "ok" : "not ok", "\n"; print normalHalfFull("=EF=BE=8A=EF=BE=9F=EF=BD=B0=EF=BE=99=E3=80=80=EF=BC= =B0=EF=BD=85=EF=BD=92=EF=BD=8C") eq "=E3=83=91=E3=83=BC=E3=83=AB=E3=80=80Perl" ? "ok" : "not ok", "\n"; __END__ SADAHIRO Tomoyuki