package CBOR::Free::X::WideCharacter; use strict; use warnings; use parent qw( CBOR::Free::X::Base ); use Text::Control (); sub _new { my ($class, $value) = @_; my $hex = Text::Control::to_hex($value); $hex = _escape_multibyte($hex); return $class->SUPER::_new("Cannot encode wide character(s): “$hex”"); } sub _escape_multibyte { my ($value) = @_; for my $i ( reverse 0 .. (length($value) - 1) ) { my $chr = substr( $value, $i, 1 ); if (ord $chr > 0xff) { substr( $value, $i, 1, sprintf "\\x{%x}", ord $chr ); } } utf8::encode($value); return "$value"; } 1;