2017-02-13 54 views
-1

Моя программа Delphi не возвращает правильные символы. SetThreadLocale for the entire Delphi application - это контекст моей проблемы. Я использую Firebird 1.5 charset NONE database, которая содержит данные WIN1257. Я использую Delphi 10 Seattle IBX для извлечения данных из этой базы данных. Обычно я использую свою программу в Windows с одним из балтийских языков для программ, отличных от Юникода. Но иногда мне нужно запустить мою программу на Windows с русской локалью (набор символов WIN1251).Delphi - преобразование между наборами символов - объяснение и как это сделать?

И я застрял со следующей проблемой: поле VARCHAR база данных содержит символ ā, который извлекается в Delphi код (fieldname.asString), как \u0101, когда программа запускается с Балтийским локали, но retrievied (fieldname.asString) как \u0432, когда программа запускается с русским языком, но мне нужно, чтобы она отображалась как \u0101 в русском случае.

Я попытался установить все параметры соединения в TIBDatabase, но не смог достичь своей цели. Итак, теперь у меня есть идея сделать перевод: я могу обнаружить, что программа работает под русским языком, и в этом случае я могу применить специальную функцию преобразования, такую ​​как MyConvert(fieldname.asString), чтобы преобразовать \u0432 в \u0101 и что-то вроде этого для всех персонажей.

Вопрос: есть ли такая функция преобразования и как ее использовать? Каков алгоритм, определяющий биекцию \u0432 < ->\u0101?

Перенос в базу данных юникода не является моим вариантом.

Текущий вопрос пытается решить ту же самую проблему с SetThreadLocale for the entire Delphi application, но с другой подход. Мне не удалось установить языковой стандарт для моего приложения, и поэтому я решил сделать преобразование символов, и этот вопрос - как это сделать?

Добавлено:https://en.wikipedia.org/wiki/Windows-1251 и https://en.wikipedia.org/wiki/Windows-1257 палитр показывают, что a имеет положение E2, и это положение в обеих палитрах имеют разные, но известно, символы Unicode, поэтому отображение известно и не существует единой формулы, как выразить это, она должна делается персонаж по характеру основа.

+1

Отвергая Unicode кажется безрассудным –

ответ

-1

Следующая функция является ответом я искал:

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;