Problemas de codificación con archivos .dbf de dBase III en diferentes máquinas
Estoy usando C # y .NET 3.5, tratando de importar algunos datos de archivos dbf viejos usando ODBC con Microsoft dBase Driver.
Los dbf están en formato dBase III y utilizan la codificación ibm850 para cadenas.
Ahora, cuando ejecuto mi programa en mi máquina, todos los datos de cadena leídos de OdbcDataReader salen convertidos a UTF-16 o UTF-8 o algo así, idk y lo guardo como UTF-8 y todo está bien, pero cuando intento use este programa en un cuadro de XP, algunos caracteres no se convierten correctamente a UTF-8. 'Õ' por ejemplo. Puede haber algunos otros también. Personajes como 'Ä', 'Ö' y 'Ü' están bien. Este es el problema. Quizás el ODBC o el controlador usen información de cultura de máquina o algo para estropear todo.
¿Es posible leer cadenas de la base de datos como binarias? ¿Quizás algunas funciones como CONVERT o CAST? ¿O dónde podría encontrar algunas referencias para las funciones y la sintaxis de SQL que funcionan para este controlador dBase u otros controladores? Busqué alrededor y no pude encontrar nada. Me siento tan ciego cuando uso ODBC y SQL.
En este momento estoy usando un truco temporal que reemplaza todos los σ por Õ.
¡Gracias!
Código de ejemplo:
System.Data.Odbc.OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=" + dbPath + ";";
oConn.Open();
System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";
System.Data.Odbc.OdbcDataReader reader = oCmd.ExecuteReader();
reader.Read();
byte[] buf = Encoding.UTF8.GetBytes(reader.GetString(0));
BinaryWriter writer = new BinaryWriter(File.Open(@"C:\DBF\Test.txt", FileMode.Create));
writer.Write(buf);
Resultado:
E5 en dbf (Õ en 850)
Test.txt en pc1: C3 95 (Õ en UTF-8)
Test.txt en pc2: CF 83 (σ en UTF-8)