![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
опять кодировка
Sank © (2006-07-28 13:47:00)Люди, а можете объяснить следуюшее:
Использую 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-файл в дос-кодировке, а из-за этой баги не получается ...
Sank (2006-07-28 16:31:00) [1]Вобщем так оно и есть.
TDbf автоматом переводит из виндовой в ДОС
Я получается делал двойной перевод кодировок
Desdechado - вы телепат :)
tesseract (2006-07-28 16:25:00) [2]да я вручную правил,
у меня какая-то допотопная версия.
Германн (2006-07-28 16:10:00) [3]
> tdbf не использует bde.
Тады молчу. :-)
tesseract (2006-07-28 16:08:00) [4]
> Германн © (28.07.06 16:04) [15]
tdbf не использует bde.
кодировка "унутрях" есть, у меня сам не переводил, по моему править пришлось.
Desdechado (2006-07-28 16:04:00) [5]А в самом компоненте случайно нет указания, в какой кодировке он сейчас работает?
А то, может, двойное преобразование делаешь?
Германн (2006-07-28 16:04:00) [6]
> А у TDbf настроек почти нет.
> Там и понятия LANGDRIVER нету ...
> Может есть конечно - сейчас буду исходники копать.
>
BDEADMIN.EXE > Configuration > DRIVERS > NATIVE > DBASE > LANGDRIVER
Sank (2006-07-28 15:59:00) [7]А у TDbf настроек почти нет.
Там и понятия LANGDRIVER нету ...
Может есть конечно - сейчас буду исходники копать.
Sank (2006-07-28 15:57:00) [8]WriteLn он отлично кушает преобразованные строки.
А вот у AsString проблемы ...
наверное где-то в исходниках TDbf трабл ... :(
Германн (2006-07-28 15:55:00) [9]Какой LANGDRIVER установлен для DBASE?
Sank (2006-07-28 15:53:00) [10]так!
похоже нашёл в чём бага.
Где-то в присвоении AsString
так же символы херятся как при копировании в буфер обмена.
Ладно. Буду копать исходники TDbf ...
Zeqfreed (2006-07-28 15:52:00) [11]> [9] Zeqfreed © (28.07.06 15:51)
Пардон, конечно там StrToOEM.
Zeqfreed (2006-07-28 15:51:00) [12]
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, согласно справке, является устаревшей и сохранена лишь для совместимости. Поэтому, мой код, в общем-то, является аналогом вашего.
Sank (2006-07-28 15:48:00) [13]ну вы не так поняли слово копирование ...
я имел в виду
dm.dbfMaster.FieldByName('SENDER').AsString := WinToDos2('Проверка');
то, что возвращает WinToDos2('Проверка')
кипирую в dm.dbfMaster.FieldByName('SENDER').AsString
:)
ну т.е. присваиваю
Германн (2006-07-28 15:41:00) [14]
> В dm.dbfMaster есть 2 строковых поля по 254 символа и всё.
> И вот после копирования получаю кракозябы ...
>
Пардон. В приведённом коде никакого копированияне видно.
Sank (2006-07-28 15:36:00) [15]Нее.
Буфер - это я для примера привёл.
В 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 символа и всё. И вот после копирования получаю кракозябы ...
Reindeer Moss Eater (2006-07-28 15:20:00) [16]Ты бы еще рассказал каким образом данные из буфера попадают в Dbase
Sank (2006-07-28 15:15:00) [17]не
раскладка тут не причём.
я конечно попробовал, но всё равно ничего не изменилось
Reindeer Moss Eater (2006-07-28 15:05:00) [18]перед копированием в буфер переключай раскладку клавиатуры на русский.
Sank (2006-07-28 14:57:00) [19]Не. Я вставляю не в консоль, всмысле не использую вставку через возможности консоли. С этим проблем нет. Фар вполне нормально вставляет из виндового буфера.
То же самое происходит, когда я пишу в dbf-ку.
Т.е. я перевожу в ДОС, потом присваюваю .AsString := WinToDos(...); и получаю кракозябы и в виндовой кодировке и в досовской. Как мне в дбф-ку записать текст в досовской кодировке?
Reindeer Moss Eater (2006-07-28 14:14:00) [20]перед копированием в буфер переключай раскладку клавиатуры на русский.