2017-02-13 1 views
-1

Mon programme Delphi ne récupère pas les bons caractères. SetThreadLocale for the entire Delphi application est le contexte de mon problème. J'utilise Firebird 1.5 charset base de données NONE qui contient des données WIN1257. J'utilise Delphi 10 Seattle IBX componentes pour récupérer des données de cette base de données. Habituellement j'utilise mon programme sur Windows avec l'un des paramètres régionaux de la Baltique pour les programmes non-Unicode. Mais parfois, j'ai besoin d'exécuter mon programme sur Windows avec les paramètres régionaux russe (WIN1251 characteret).Delphi - conversion entre les jeux de caractères - explication et comment le faire?

Et je suis coincé avec le problème suivant: base de données champ varchar contient le caractère ā, qui est récupéré dans le code Delphi (fieldname.asString) comme \u0101 lorsque le programme est exécuté avec locale Baltique, mais il est retrievied (fieldname.asString) comme \u0432 lorsque le programme est exécuté avec les paramètres régionaux russes, mais j'ai besoin qu'il soit affiché comme \u0101 dans le cas russe également.

J'ai essayé de définir tous les paramètres de connexion à TIBDatabase mais je n'ai pas réussi à atteindre mon objectif. Donc - maintenant j'ai idée de faire la traduction: je peux détecter que le programme fonctionne en russe et dans ce cas je peux appliquer une fonction de conversion spéciale comme MyConvert(fieldname.asString) pour convertir \u0432 en \u0101 et quelque chose comme ça pour tous les caractères.

La question est - existe-t-il une telle fonction de conversion disponible et comment l'utiliser? Quel est l'algorithme qui détermine la bijection? \u0432 < ->\u0101?

La migration vers la base de données Unicode n'est pas mon option.

La question actuelle tente de résoudre le même problème de base que SetThreadLocale for the entire Delphi application mais avec approche différente. Je n'ai pas réussi à définir les paramètres régionaux de thread pour mon application et donc j'ai décidé de faire la conversion de caractères et cette question est - comment le faire?

Ajouté:https://en.wikipedia.org/wiki/Windows-1251 et https://en.wikipedia.org/wiki/Windows-1257 palettes montrent que a a la position E2 et cette position dans les deux palettes ont différents, mais connu des caractères Unicode, de sorte que la cartographie est connue et il n'y a pas de formule comment l'exprimer, il devrait être fait caractère par caractère.

+1

Rejetant Unicode semble téméraires –

Répondre

-1

La fonction suivante est la réponse que je cherchais:

function MyConversionFunction(AChar: Char): Char; 
begin 
    case Ord(AChar) of 
    //A_ 
    $045E: Result:=Char($00A2); 
    $0408: Result:=Char($00A3); 
    $00A4: Result:=Char($00A4); 
    $00A6: Result:=Char($00A6); 
    $00A7: Result:=Char($00A7); 
    $0401: Result:=Char($00D8); 
    $00A9: Result:=Char($00A9); 
    $0404: Result:=Char($0156); 
    $00AB: Result:=Char($00AB); 
    $00AC: Result:=Char($00AC); 
    $00AD: Result:=Char($00AD); 
    $00AE: Result:=Char($00AE); 
    $0407: Result:=Char($00C6); 
    //B_ 
    $0406: Result:=Char($00B2); 
    $0456: Result:=Char($00B3); 
    $0491: Result:=Char($00B4); 
    $0451: Result:=Char($00F8); 
    $2116: Result:=Char($00B9); 
    $0454: Result:=Char($0157); 
    $0458: Result:=Char($00BC); 
    $0405: Result:=Char($00BD); 
    $0455: Result:=Char($00BE); 
    $0457: Result:=Char($00E6); 
    //C_ 
    $0410: Result:=Char($0104); 
    $0411: Result:=Char($012E); 
    $0412: Result:=Char($0100); 
    $0413: Result:=Char($0106); 
    $0414: Result:=Char($00C4); 
    $0415: Result:=Char($00C5); 
    $0416: Result:=Char($0118); 
    $0417: Result:=Char($0112); 
    $0418: Result:=Char($010C); 
    $0419: Result:=Char($00C9); 
    $041A: Result:=Char($0179); 
    $041B: Result:=Char($0116); 
    $041C: Result:=Char($0122); 
    $041D: Result:=Char($0136); 
    $041E: Result:=Char($012A); 
    $041F: Result:=Char($013B); 
    //D_ 
    $0420: Result:=Char($0160); 
    $0421: Result:=Char($0143); 
    $0422: Result:=Char($0145); 
    $0423: Result:=Char($00D3); 
    $0424: Result:=Char($014C); 
    $0425: Result:=Char($00D5); 
    $0426: Result:=Char($00D6); 
    $0427: Result:=Char($00D7); 
    $0428: Result:=Char($0172); 
    $0429: Result:=Char($0141); 
    $042A: Result:=Char($015A); 
    $042B: Result:=Char($016A); 
    $042C: Result:=Char($00DC); 
    $042D: Result:=Char($017B); 
    $042E: Result:=Char($017D); 
    $042F: Result:=Char($00DF); 
    //E_ 
    $0430: Result:=Char($0105); 
    $0431: Result:=Char($012F); 
    $0432: Result:=Char($0101); 
    $0433: Result:=Char($0107); 
    $0434: Result:=Char($00E4); 
    $0435: Result:=Char($00E5); 
    $0436: Result:=Char($0119); 
    $0437: Result:=Char($0113); 
    $0438: Result:=Char($010D); 
    $0439: Result:=Char($00E9); 
    $043A: Result:=Char($017A); 
    $043B: Result:=Char($0117); 
    $043C: Result:=Char($0123); 
    $043D: Result:=Char($0137); 
    $043E: Result:=Char($012B); 
    $043F: Result:=Char($013C); 
    //F_ 
    $0440: Result:=Char($0161); 
    $0441: Result:=Char($0144); 
    $0442: Result:=Char($0146); 
    $0443: Result:=Char($00F3); 
    $0444: Result:=Char($014D); 
    $0445: Result:=Char($00F5); 
    $0446: Result:=Char($00F6); 
    $0447: Result:=Char($00F7); 
    $0448: Result:=Char($0173); 
    $0449: Result:=Char($0142); 
    $044A: Result:=Char($015B); 
    $044B: Result:=Char($016B); 
    $044C: Result:=Char($00FC); 
    $044D: Result:=Char($017C); 
    $044E: Result:=Char($017E); 
    $044F: Result:=Char($02D9); 
    else Result:=AChar; 
    end; 
end;