Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

опять кодировка   Найти похожие ветки 

 
Sank   (2006-07-28 13:47) [0]

Люди, а можете объяснить следуюшее:
Использую AnsiToOem для перевода кодировки из виндовой в досовскую, потом результат копирую в буфер (получаем кракозябы), потом запускаю фар, создаю там файл, выбираю кодировку виндовс, копирую кракозябы в файл, потом переключаю кодировку ДОС и по идее должно получиться всё по русски, но я продолжаю видеть кракозябы. Почему так?
Вот код для подтверждения:


procedure TForm1.Button1Click(Sender: TObject);
function WinToDos(St: string): string;
var
Ch: PChar;
begin
Ch := StrAlloc(Length(St) + 1);
AnsiToOem(PChar(St), Ch);
Result := Ch;
StrDispose(Ch);
end;
begin
 Clipboard.AsText := WinToDos("123 Тест на прочтность");
end;


А если AnsiToOem использовать в WriteLn(), то всё отлично работает и отображается по русски. не объясните где бага? А то мне надо формировать dbf-файл в дос-кодировке, а из-за этой баги не получается  ...


 
Reindeer Moss Eater ©   (2006-07-28 14:14) [1]

перед копированием в буфер переключай раскладку клавиатуры на русский.


 
Sank   (2006-07-28 14:57) [2]

Не. Я вставляю не в консоль, всмысле не использую вставку через возможности консоли. С этим проблем нет. Фар вполне нормально вставляет из виндового буфера.
То же самое происходит, когда я пишу в dbf-ку.
Т.е. я перевожу в ДОС, потом присваюваю .AsString := WinToDos(...); и получаю кракозябы и в виндовой кодировке и в досовской. Как мне в дбф-ку записать текст в досовской кодировке?


 
Reindeer Moss Eater ©   (2006-07-28 15:05) [3]

перед копированием в буфер переключай раскладку клавиатуры на русский.


 
Sank   (2006-07-28 15:15) [4]

не
раскладка тут не причём.
я конечно попробовал, но всё равно ничего не изменилось


 
Reindeer Moss Eater ©   (2006-07-28 15:20) [5]

Ты бы еще рассказал каким образом данные из буфера попадают в Dbase


 
Sank   (2006-07-28 15:36) [6]

Нее.
Буфер - это я для примера привёл.
В DBase они попадают через обычное присвоение.
Стоит у меня компонент TDbf
Юзаю такой код:

function WinToDos(St: string): string;
var
Ch: PChar;
begin
Ch := StrAlloc(Length(St) + 1);
AnsiToOem(PChar(St), Ch);
Result := Ch;
StrDispose(Ch);
end;
begin

     dm.dbfMaster.FilePath := ExtractFilePath(ParamStr(0));
     dm.dbfMaster.TableName := "wbh.dbf";
     try
       if FileExists(dm.dbfMaster.FilePath+dm.dbfMaster.TableName) then DeleteFile(PChar(dm.dbfMaster.FilePath+dm.dbfMaster.TableName));
       dm.dbfMaster.CreateTable; dm.dbfMaster.Open;
       dm.dbfMaster.Last;
         dm.dbfMaster.Append;
         dm.dbfMaster.FieldByName("SENDER").AsString := WinToDos2("Проверка");
         dm.dbfMaster.FieldByName("RECIPIENT").AsString := WinToDos2("Работает?");
         dm.dbfMaster.Post;
     finally
       dm.dbfMaster.Close;
     end;
end;

В dm.dbfMaster есть 2 строковых поля по 254 символа и всё. И вот после копирования получаю кракозябы ...


 
Германн ©   (2006-07-28 15:41) [7]


> В dm.dbfMaster есть 2 строковых поля по 254 символа и всё.
>  И вот после копирования получаю кракозябы ...
>

Пардон. В приведённом коде никакого копирования не видно.


 
Sank   (2006-07-28 15:48) [8]

ну вы не так поняли слово копирование ...
я имел в виду
dm.dbfMaster.FieldByName("SENDER").AsString := WinToDos2("Проверка");
то, что возвращает WinToDos2("Проверка")
кипирую в dm.dbfMaster.FieldByName("SENDER").AsString
:)
ну т.е. присваиваю


 
Zeqfreed ©   (2006-07-28 15:51) [9]

procedure TForm1.Button1Click(Sender: TObject);

 function StrToOEM(const Src : String) : String;
 begin
  SetLength(Result, length(Src));
  CharToOEM(PChar(Src), @Result[1]);
 end;

var
 f : TextFile;
begin
 AssignFile(f, "C:/1.txt");
 Rewrite(f);
 WriteLn(f, WinToDOS("123 Тест на прочтность"));
 CloseFile(f);
end;


Как вы можете сами убедиться, сохраняется файл в корректной DOS-кодировке. AnsiToOEM, согласно справке, является устаревшей и сохранена лишь для совместимости. Поэтому, мой код, в общем-то, является аналогом вашего.


 
Zeqfreed ©   (2006-07-28 15:52) [10]

> [9] Zeqfreed ©   (28.07.06 15:51)

Пардон, конечно там StrToOEM.


 
Sank   (2006-07-28 15:53) [11]

так!
похоже нашёл в чём бага.
Где-то в присвоении AsString
так же символы херятся как при копировании в буфер обмена.
Ладно. Буду копать исходники TDbf ...


 
Германн ©   (2006-07-28 15:55) [12]

Какой LANGDRIVER установлен для DBASE?


 
Sank   (2006-07-28 15:57) [13]

WriteLn он отлично кушает преобразованные строки.
А вот у AsString проблемы ...
наверное где-то в исходниках TDbf трабл ... :(


 
Sank   (2006-07-28 15:59) [14]

А у TDbf настроек почти нет.
Там и понятия LANGDRIVER нету ...
Может есть конечно - сейчас буду исходники копать.


 
Германн ©   (2006-07-28 16:04) [15]


> А у TDbf настроек почти нет.
> Там и понятия LANGDRIVER нету ...
> Может есть конечно - сейчас буду исходники копать.
>

BDEADMIN.EXE > Configuration > DRIVERS > NATIVE > DBASE > LANGDRIVER


 
Desdechado ©   (2006-07-28 16:04) [16]

А в самом компоненте случайно нет указания, в какой кодировке он сейчас работает?
А то, может, двойное преобразование делаешь?


 
tesseract ©   (2006-07-28 16:08) [17]


> Германн ©   (28.07.06 16:04) [15]


tdbf не использует bde.

кодировка "унутрях" есть, у меня сам не переводил, по моему править пришлось.


 
Германн ©   (2006-07-28 16:10) [18]


> tdbf не использует bde.

Тады молчу. :-)


 
tesseract ©   (2006-07-28 16:25) [19]

да я вручную правил,
у меня какая-то допотопная версия.


 
Sank   (2006-07-28 16:31) [20]

Вобщем так оно и есть.
TDbf автоматом переводит из виндовой в ДОС
Я получается делал двойной перевод кодировок
Desdechado - вы телепат :)



Страницы: 1 вся ветка

Текущий архив: 2006.08.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.121 c
15-1153644541
Каг Дила?
2006-07-23 12:49
2006.08.20
Сетевая игра


15-1152300766
lookin
2006-07-07 23:32
2006.08.20
Поздравьте меня... плз...


3-1150304770
vvQuad
2006-06-14 21:06
2006.08.20
Перенос БД на другой комп


15-1153971454
Nic
2006-07-27 07:37
2006.08.20
Вопросик по php


2-1154368157
Jimmy
2006-07-31 21:49
2006.08.20
Работа программы после Form2.ShowModal