If not solved , some context could help (sometimes one tries a solution to a problem but discuss only about the solution. Finally you realize when knowing the problem that another solution should be applied as the problem is not what the OP
thought, so if you do this because you are trying to solve some kind of issue you had, please discuss about this original issue).

For exemple .NET classes should be able to process utf-16 files without having to convert them first...

Strings in memory are always UTF-16. That is simply how they are stored. No matter how hard you try to Encode it, once you put it in a string it's going to be back to UTF-16 (or at least the byte are going to be interpreted as in UTF-16).

The two ways I found are to either have a writer that recodes it during wirting*, or store & read them as byte-array/byte stream.

If not solved , some context could help (sometimes one tries a solution to a problem but discuss only about the solution. Finally you realize when knowing the problem that another solution should be applied as the problem is not what the OP
thought, so if you do this because you are trying to solve some kind of issue you had, please discuss about this original issue).

For exemple .NET classes should be able to process utf-16 files without having to convert them first...

Strings in memory are always UTF-16. That is simply how they are stored. No matter how hard you try to Encode it, once you put it in a string it's going to be back to UTF-16 (or at least the byte are going to be interpreted as in UTF-16).

The two ways I found are to either have a writer that recodes it during wirting*, or store & read them as byte-array/byte stream.