кирилица проблем

7 отговора 336 прегледа
#1

кирилица проблем

Проблема ми е следния:
ползвам делпхи 7 трябва да запиша информация в тхт файл на кирилица
когато я отварям на моя компутер е ОК когато я отварям под дос излизат йероглифи.
Помощ

Отговор
в отговор на newbie #2

Re: кирилица проблем

Това не зависи от Delphi. Кодовата таблица за DOS и Windows е различна. Трябва да се конвертират данните от Windows в DOS.

Отговор
в отговор на newbie #3

Re: кирилица проблем

Ами нормално е. ДОС и Вин имат различни кодови таблици, ASCII и ANSI съответно. Няма начин да видиш кирилицата коректно едновременно в Notepad /Вин/ и Edit/Pe2 под ДОС. Така, че избираш една от кодировките в зависимост от това, дали програмата ти работи основно под ДОС или Вин. Предполагам, че Вин.

За кодиране от ДОС към Вин можеш да използваш този код:
unsigned char chU; // C++
for (int i = 1; i <= strTmp.Length(); i++)
{ chU = strTmp[ i ];
if ((chU > 127)&&(chU < 192)) chU += 64;
strTmp[ i ] = chU;
}


За прекодиране от Вин към ДОС:
unsigned char uch; // C++
for (int i = 1 ; i <=strTmp.Length(); i++)
{ uch = strTmp[ i ];
if (uch > 191)
{ uch -= 64;
strTmp[ i ] = uch;
}
}
Присвояването на uch може да се избегне с dynamic_cast, но не знам, дали има аналог в Паскал. Имай в предвид, че символа 'No' под ДОС е 1 символ (252 десетично май) и няма съответствие във Вин кодовата таблица.

Редактирано от Beco_ на

Отговор
в отговор на Beco_ #4

Re: кирилица проблем

Хиляди благодарности +++

Отговор
в отговор на Beco_ #5

Re: кирилица проблем

ето и паскалския код ако на някои му потрябва все пак

още веднъж мерси

function WinToDos(S: String): String;
var
I: Integer;
begin
for I:= 1 to Length(S) do
if Ord(S)> 191 then S:= Chr(Ord(S) - 64);
Result:= S;
end;

function DosToWin(S: String): String;
var
I: Integer;
begin
for I:= 1 to Length(S) do
if (Ord(S) > 127) and (Ord(S) < 192) then S:= Chr(Ord(S) + 64);
Result:= S;
end;

Отговор
в отговор на newbie #6

Re: кирилица проблем

Ако искаш погледни това.

//Mask = TRUE - WinToDos; FALSE - DosToWin
function NewWinDos(const S:String;const Mask:boolean):String;
type
TDosWin=Set of 128..255;
DosWinRecord = Record
Znak:SmallInt;
DataDosWin:TDosWin;
end;
const
DosWin:array[boolean] of DosWinrecord =
((Znak:1;DataDosWin:[128..191]),
(Znak:-1;DataDosWin:[192..255]));
var
I:Integer;
begin
Result:=S;
for I:=1 to length(Result) do
if Ord(Result) in DosWin[Mask].DataDosWin then
Result:=Chr(Ord(Result) + DosWin[Mask].Znak * 64);
end;

Редактирано от TRN на

Отговор
в отговор на Beco_ #7

Re: кирилица проблем

a 185 кво е? // на кирилица

test ALT+0185 от NUMPAD

Отговор
в отговор на EFEX #8

Re: кирилица проблем

Mea culpa

Отговор