аналог CharToOem

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

аналог CharToOem

Сообщение alaken » 25.03.2010 11:51:33

существует ли аналог CharToOem
или какой нибудь другой метод конвертирования строки из кодировки WIN в DOS?
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: аналог CharToOem

Сообщение Mr.Smart » 25.03.2010 12:21:14

Конечно в модуле windows данные функции есть т.к. они являются частью WinAPI :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: аналог CharToOem

Сообщение v-t-l » 25.03.2010 13:22:18

Если только для винды нужно, то CharToOEM.
Иначе
Код: Выделить всё
uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: аналог CharToOem

Сообщение alaken » 25.03.2010 14:13:58

v-t-l писал(а):Если только для винды нужно, то CharToOEM.
Иначе
Код: Выделить всё
uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));


думаю это то что нужно, но только в моем случае ничего не получается.

Открываю текстовый файл компонентом TStringList.LoadFromFile, файл в win кодировке.
Потом преобразую текст компонента функцией UTF8ToCP866, в результате вместо русских символов пробелы...
что я делаю не так?
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: аналог CharToOem

Сообщение v-t-l » 25.03.2010 15:04:10

Если нужно выводить в мемо или листбокс, то все контролы в лазарусе используют Utf8, то есть достаточно будет AnsiToUtf8().
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: аналог CharToOem

Сообщение alaken » 25.03.2010 15:28:43

нужно сохранить в файл, в dos кодировке.

Научным методом тыка дошел до нужного результата.

помогло следующее:
Код: Выделить всё
sl.Text := UTF8ToCP866(AnsiToUTF8(sl.Text));


Добавлено спустя 12 минут 22 секунды:

простите мне мою невнимательность в вашем посте ужел был нужный мне ответ
v-t-l писал(а):Если только для винды нужно, то CharToOEM.
Иначе
Код: Выделить всё
uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));


огромное спасибо.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: аналог CharToOem

Сообщение alaken » 29.03.2010 14:59:20

неожиданный эффект при кодировании из CP1251 в CP866

символы "¦" пропадают.

пример:
Код: Выделить всё
sl.Text := UTF8ToCP866(CP1251ToUTF8(sl.Text));


думаю это где то в функции UnicodeToCP866 модуля LConvEncoding

да так и есть

поправил
Код: Выделить всё
function UnicodeToCP866(Unicode: cardinal): integer;
begin
  case Unicode of
  0..127: Result:=Unicode;
  166: Result := 124;                 // добавил эту строчку
  1040..1087 : Result := Unicode-912;


напишите в баг-треккер, а то я даже не знаю где он есть, ну и с английским трудности...

написал в багтреккер....
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: аналог CharToOem

Сообщение alaken » 07.04.2010 17:54:42

Последний раз редактировалось alaken 07.04.2010 18:46:47, всего редактировалось 1 раз.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: аналог CharToOem

Сообщение Sergei I. Gorelkin » 07.04.2010 18:38:01

Вообще-то кодам 166 (broken bar) и 124 (vertical line) соответствуют совершенно разные символы. Cимвол "broken bar" в кодировке CP1251 есть, а в CP866 его просто нет, потому и должен пропадать.
ps: Ага, вижу что Jesus Reyes именно так все и понял...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: аналог CharToOem

Сообщение alaken » 07.04.2010 18:54:19

в Delphi работает иммено так 166 (broken bar) на 124 (vertical line) меняется, думаю это правильно, хотя не логично, потому что, обратное кодирование не даст начальный результат.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: аналог CharToOem

Сообщение Sergei I. Gorelkin » 07.04.2010 19:27:21

...При более внимательном рассмотрении оказывается, что CharToOem вообще очень своеобразна. Видно, что там есть попытки сохранить начертание символов: "±" превращается в обычный плюс и т.п. Но вот объяснить превращение 149 в 7 я не берусь...
Т.е. там что-то M$-специфичное, имеющеe c Unicode не слишком много общего...

Так что, если требуется в точности такое же поведение, его, наверное, проще всего написать самостоятельно.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: аналог CharToOem

Сообщение alaken » 07.04.2010 20:03:21

Sergei I. Gorelkin писал(а):Так что, если требуется в точности такое же поведение, его, наверное, проще всего написать самостоятельно.

совершенно с вами согласен, думаю я сделал ошибку написав в багтрекер, UTF8ToCP866 корректно работает с логической точки зрения. Нужное мне кодирование лучше реализовать в своей программе, и не лезть в правильно работающий код метода UTF8ToCP866.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56

Рейтинг@Mail.ru