http://www.perlmonks.org?node_id=1021070

hexdump only shows ASCII characters in the visualisation column, and substitutes everything else with a period. That's lame, but nothing that the following filter from my ~/.bashrc couldn't fix:
# Turn   1220  4c 29 e5 41 89 ff 49 89  f6 48 c1 fd 03 49 89 d5  L).A..I. .H...I..
# into   1220  4c 29 e5 41 89 ff 49 89  f6 48 c1 fd 03 49 89 d5  L)åA�ÿI�öHÁý␃I�Õ
# requires http://catb.org/~esr/hexdump/
hex () {
    hexdump $@ | perl -C -ne'
        $_ = substr $_, 0, 56;  # without right-hand side columns
        print $_;
        @F = split;             # split on space
        shift @F;               # drop address column
        for (@F) {
            $h = hex;
            if ($h < 32) {
                print chr($h+0x2400);   # control character symbols
            } elsif (127 == $h) {
                print chr 0x2421;       # delete symbol
            } elsif (0x80 <= $h and $h <= 0x9f) {
                print chr 0xFFFD;       # undefined in iso-latin-1
            } elsif (0xa0 == $h) {
                print chr 0x2420;       # non-breaking space as space symbol
            } else {
                print chr $h;           # just the character as is
            };
        };
        print qq(\n);
    '
}