аналог CharToOem

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

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

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

аналог CharToOem

Сообщение alaken »

существует ли аналог CharToOem
или какой нибудь другой метод конвертирования строки из кодировки WIN в DOS?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Конечно в модуле windows данные функции есть т.к. они являются частью WinAPI :wink:
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Если только для винды нужно, то CharToOEM.
Иначе

Код: Выделить всё

uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

v-t-l писал(а):Если только для винды нужно, то CharToOEM.
Иначе

Код: Выделить всё

uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));


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

Открываю текстовый файл компонентом TStringList.LoadFromFile, файл в win кодировке.
Потом преобразую текст компонента функцией UTF8ToCP866, в результате вместо русских символов пробелы...
что я делаю не так?
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Если нужно выводить в мемо или листбокс, то все контролы в лазарусе используют Utf8, то есть достаточно будет AnsiToUtf8().
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

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

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

помогло следующее:

Код: Выделить всё

sl.Text := UTF8ToCP866(AnsiToUTF8(sl.Text));


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

простите мне мою невнимательность в вашем посте ужел был нужный мне ответ
v-t-l писал(а):Если только для винды нужно, то CharToOEM.
Иначе

Код: Выделить всё

uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));


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

Сообщение alaken »

неожиданный эффект при кодировании из 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 08:02:13

Сообщение alaken »

Последний раз редактировалось alaken 07.04.2010 18:46:47, всего редактировалось 1 раз.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Вообще-то кодам 166 (broken bar) и 124 (vertical line) соответствуют совершенно разные символы. Cимвол "broken bar" в кодировке CP1251 есть, а в CP866 его просто нет, потому и должен пропадать.
ps: Ага, вижу что Jesus Reyes именно так все и понял...
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

в Delphi работает иммено так 166 (broken bar) на 124 (vertical line) меняется, думаю это правильно, хотя не логично, потому что, обратное кодирование не даст начальный результат.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Так что, если требуется в точности такое же поведение, его, наверное, проще всего написать самостоятельно.
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

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

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