Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Внизопять кодировка Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c