Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Re: How to convert hash keys to utf8

by mpersico (Monk)
on Sep 23, 2021 at 18:06 UTC ( #11136971=note: print w/replies, xml ) Need Help??

in reply to How to convert hash keys to utf8

In the end, I wrote this:
use Data::Structure::Util qw(get_refs utf8_on); sub _perl_to_python_utf8_on { # We need to convert the hash keys ourselves. # 'get_refs' digs through the data structure # and returns an array ref of every reference # in the structure, at all levels. # All Hail CPAN; so glad I didn't have to walk # the data myself. my $refs = get_refs( $_[0] ); # For each ref, process just the hashes. for my $ref ( @{$refs} ) { if ( ref($ref) eq 'HASH' ) { for my $key ( keys %$ref ) { # See text below. $ref->{ utf8_on($key) } = $ref->{$key}; } } } # Let the utility convert everything else. return utf8_on( $_[0] ); }
You might think that the statement $ref->{ utf8_on($key) } = $ref->{$key}; would produce duplicate keys, but it does not; I went back and wrote key counting tests to prove it after reading other comments in this thread. The key (pun intended) to understanding what's going on here is that I believe utf8_on() only twiddles metadata; it does not change the actual value of the key. Hence we don't get duplicate entries and do not need to do
$ref->{ utf8_on($key) } = delete $ref->{$key}.
You'd also think that I've now mismatched the key string and its metadata, but Inline::Python seems to be Doing the Right Thing with it, so I am leaving well enough alone for now. Maybe the utf8 'value' of each char is the same as its ascii value when less than 128 or 255?

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11136971]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (2)
As of 2021-12-08 04:35 GMT
Find Nodes?
    Voting Booth?
    R or B?

    Results (34 votes). Check out past polls.