Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.042 c
3-1150370483
Alexey V.
2006-06-15 15:21
2006.08.20
Импорт dbf файлов в Firebird


15-1153719008
Ega23
2006-07-24 09:30
2006.08.20
С Днём рождения! 23 июля


2-1154094488
Батя
2006-07-28 17:48
2006.08.20
label и form


2-1153988032
1519
2006-07-27 12:13
2006.08.20
Завершение работы


2-1154319423
MSSS
2006-07-31 08:17
2006.08.20
Регулировака громкости





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский