¿Cómo leer archivos DOS con caracteres ASCII extendido?

Leyendo archivos DOS con caracteres especiales

Copyright © 2000 Ernesto De Spirito

SMImport - Componentes VCL nativos para importar datos

A veces tenemos que leer archivos DOS guardados con aplicaciones DOS. No hay problema con le lectura en sí misma, pero Windows y DOS usan de modo predeterminado diferentes páginas de códigos para mapear los caracteres ASCII especiales.

Por ejemplo, en DOS (página de códigos 437 -IBM estándar- y otras páginas de códigos típicamente usadas en DOS), el símbolo "registrado" ('®') se representa en un byte con el valor 169. Sin embargo, en Windows (págia de códigos 1252 y otras páginas de códigos típicamente usadas en Windows), el valor 169 corresponde al símbolo de copyright ('©') y el símbolo de "registrado" ('®') tiene un valor de 174. Algo similar ocurre con otros símbolos como los las vocales acentadas por ejemplo.

Si los datos leídos de un archivo DOS se van a mostrar o guardar en formato Windows deberemos convertir los caracteres (por ejemplo reemplazando los valores 169 por 174 y así sucesivamente) de modo que sean representados correctamente en Windows.

Podemos usar la función OemToChar de la API de Windows para convertir una variable de cadena in-situ:

uses Windows;

...
var
  s: string;
  ...
begin
  ...
  OemToChar(PChar(s), PChar(s));
  ...
end;

La conversión inversa (o sea de Windows a DOS) se logra con la función API CharToOem.

JfControls Library - para Delphi y C++ Builder