El problema que mencionas ocurre porque cuando la opción "Beta: Usar Unicode UTF-8 para soporte de lenguaje mundial" está activada en Windows, el sistema cambia el codepage predeterminado a UTF-8. Esto afecta cómo Delphi maneja cadenas en componentes VCL y en la interacción con APIs de Windows, especialmente si la aplicación asume que el codepage es ANSI.
Soluciones posibles:
1. Forzar el uso del Codepage ANSI en la aplicación
Puedes establecer explícitamente el codepage ANSI en el inicio de la aplicación. Para ello, usa:
Código Delphi
[-]
uses
System.SysUtils, Windows;
begin
SetThreadLocale(LOCALE_SYSTEM_DEFAULT);
SetConsoleOutputCP(1252); SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, '1252');
end.
Esto obliga a que la aplicación utilice el codepage estándar para español latinoamericano.
2. Evitar dependencias de ANSI y trabajar en Unicode nativo
Si tu código aún usa AnsiString o String en versiones antiguas, conviene hacer una migración a UnicodeString (que es el String predeterminado en Delphi 10.4). Evita conversiones innecesarias entre Unicode y ANSI.
3. Usar TEncoding para conversiones de texto
Si necesitas manipular archivos o comunicación con la base de datos, usa TEncoding para asegurarte de que las cadenas se procesen correctamente:
Código Delphi
[-]
var
TextoUTF8: TBytes;
TextoStr: string;
begin
TextoUTF8 := TEncoding.UTF8.GetBytes('Texto en UTF-8');
TextoStr := TEncoding.ANSI.GetString(TextoUTF8); end;
Si interactúas con bases de datos, asegúrate de que estén configuradas correctamente para Unicode o usa conversiones adecuadas.
4. Modificar el manifest de la aplicación
Si la opción de Windows está activada y afecta la compatibilidad de tu aplicación, puedes evitar que Windows la fuerce editando el manifest de la aplicación.
Abre el archivo .dproj de tu proyecto.
Busca la sección <dpiAware> y añade esta línea dentro de <application>:
Código:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<compatibility>
<application>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<windowsSettings>
<activeCodePage enabled="false"/>
</windowsSettings>
</application>
Esto le indica a Windows que tu aplicación no es compatible con cambios automáticos de codepage.
Recomendación
Si no puedes controlar la configuración de Windows en todas las máquinas, la mejor opción es hacer que tu aplicación trabaje completamente en Unicode (String = UnicodeString), evitar AnsiString, y usar TEncoding para conversiones cuando sea necesario.