Search code examples
c#.netextended-ascii

How can I convert extended ascii to a System.String?


For example: "½" or ASCII DEC 189. When I read the bytes from a text file the byte[] contains the valid value, in this case 189.

Converting to Unicode results in the Unicode replacement character 65533.

UnicodeEncoding.Unicode.GetString(b);

Converting to ASCII results in 63 or "?"

ASCIIEncoding.ASCII.GetString(b);

If this isn't possible what is the best way to handle this data? I'd like to be able to perform string functions like Replace().


Solution

  • Byte 189 represents a "½" in iso-8859-1 (aka "Latin-1"), so the following is maybe what you want:

    var e = Encoding.GetEncoding("iso-8859-1");
    var s = e.GetString(new byte[] { 189 });
    

    All strings and chars in .NET are UTF-16 encoded, so you need to use an encoder/decoder to convert anything else, sometimes this is defaulted (e.g. UTF-8 for FileStream instances) but good practice is to always specify.

    You will need some form of implicit or (better) explicit metadata to supply you with the information about which encoding.