I built a workbench estudio and tried to find out what was wrong using the debugger. I stopped in {ENCODING}.convert_to and found that the source code page is 646 and destination code page is UTF-32. Then I stepped into {ENCODING_IMP}.convert_to. The call to set `l_converted' by calling `pointer_to_string_32' appeared to work correctly. I could look at `l_converted' in the debugger and it looked reasonable. Then the code looked at the byte order mark (BOM) and decided the string was little endian. Since the destination code page was no-endian and since the platform was not little endian, the code removed the BOM and called `string_32_switch_endian'. After this call, none of the characters were valid unicode characters. So the problem seems to be that the routine thinks the value returned from `iconv' and placed into a STRING_32 starts with a BOM that indicates little endian. I don't yet know why it (mostly) works on Solaris 9.