in reply to binmode STDOUT, ":utf8"; and umlauts

:utf8 as an output layer views all output to STDOUT as text strings, converting each codepoint to UTF-8.

But the things you print to STDOUT aren't text strings, they are byte strings. The ü in your byte string is not one code point with value 195, but instead is (as hex) c3 bc. Now :utf8 converts the codepoints 0xc3 and 0xbc to UTF-8 and prints that. Not what you want.

You should take care to either only use byte strings or only text strings. I wrote an article that explains that plus lots of background (there's also a German version if you happen to like that better - considering that you're using Umlauts as examples)

If you want more documentation, read the perluniintro and perlunicode manual pages.