Lastly I have shown how to enforce encoding of strings in DBF table by setting up code-page inside its header. I also mentioned it was the easiest way. That’s still true. But sometimes there is no room to be polite and things need to be done little messy in the code (for example when the DBF file is often recreated by 3rd-party tool an can be altered in any way). So each time the string value is loaded try to recover it with those steps.
First get the original bytes stored from loaded text (assume that system inappropriately returned Windows-1250 encoded string):
var bytes = Encoding.GetEncoding("Windows-1250").GetBytes(text);
Secondly convert them from correct encoding (it was natively stored as Latin-2 aka CP-852) to UTF-8:
var convertedBytes = Encoding.Convert(Encoding.GetEncoding(852), Encoding.UTF8, bytes); return Encoding.UTF8.GetString(convertedBytes);
Of course encoding objects can be cached to increase performance.