Via Igor Skochinsky's classic IDA RTTI scripts, I found out that the names I posted are equivalent to typeid(struct xyz) (as I've added to my question).
Abusing creating a valid mangled ctor name from a substring of them and then stripping the ctor parts from the result yields great class names.
Here's my Python script and the results:
As @blabb says undname is correct so it's your other tool that is 'incorrect'.
However, it's worth looking at this in more detail as it's probably not as incorrect as you think.
To understand this though you have to delve a little into ABIs and think how a C++ function call works in practice.
Firstly, a C++ member function is in some sense like a C ...
there are lot of external utilities that can demangle a decorated name
try looking for vc++filt /
or some online demangler like this
or you can probably code one using dbghelp api UndecorateSymbolName() in python with ctype / pywin32
also undname isn't erring your second guess must be right
I just prototyped a similar function and looked at its ...