But this line:
$field =~ s/([^\x20-\x7E])/sprintf("&#x%X;", ord($1))/eg;
Won't that convert anything greater than or equal to a "space" (ascii 0x20) up to 0xfe? And why are you skipping 0xff?
And other than those things, isn't that really equivalent to what I was doing? Except that, it appears you are outputting ’ where I was outputting \, and are those in fact equivalent?
Update: I just realized I missed the fact that your regex has '^', so it negates those characters. That makes a lot more sense.
But I would still ask, isn't the functionality of this subroutine the same as my original (other than the extra 'x' in your output "#xNN;", which I still think is wrong), or am I missing something else?