аналог CharToOem
Модератор: Модераторы
аналог CharToOem
существует ли аналог CharToOem
или какой нибудь другой метод конвертирования строки из кодировки WIN в DOS?
или какой нибудь другой метод конвертирования строки из кодировки WIN в DOS?
Конечно в модуле windows данные функции есть т.к. они являются частью WinAPI 
Если только для винды нужно, то CharToOEM.
Иначе
Иначе
Код: Выделить всё
uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));v-t-l писал(а):Если только для винды нужно, то CharToOEM.
ИначеКод: Выделить всё
uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));
думаю это то что нужно, но только в моем случае ничего не получается.
Открываю текстовый файл компонентом TStringList.LoadFromFile, файл в win кодировке.
Потом преобразую текст компонента функцией UTF8ToCP866, в результате вместо русских символов пробелы...
что я делаю не так?
Если нужно выводить в мемо или листбокс, то все контролы в лазарусе используют Utf8, то есть достаточно будет AnsiToUtf8().
нужно сохранить в файл, в dos кодировке.
Научным методом тыка дошел до нужного результата.
помогло следующее:
Добавлено спустя 12 минут 22 секунды:
простите мне мою невнимательность в вашем посте ужел был нужный мне ответ
огромное спасибо.
Научным методом тыка дошел до нужного результата.
помогло следующее:
Код: Выделить всё
sl.Text := UTF8ToCP866(AnsiToUTF8(sl.Text));Добавлено спустя 12 минут 22 секунды:
простите мне мою невнимательность в вашем посте ужел был нужный мне ответ
v-t-l писал(а):Если только для винды нужно, то CharToOEM.
ИначеКод: Выделить всё
uses lconvencoding;
s := UTF8ToCP866(CP1251ToUtf8(s));
огромное спасибо.
неожиданный эффект при кодировании из CP1251 в CP866
символы "¦" пропадают.
пример:
думаю это где то в функции UnicodeToCP866 модуля LConvEncoding
да так и есть
поправил
напишите в баг-треккер, а то я даже не знаю где он есть, ну и с английским трудности...
написал в багтреккер....
символы "¦" пропадают.
пример:
Код: Выделить всё
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 07.04.2010 18:46:47, всего редактировалось 1 раз.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Вообще-то кодам 166 (broken bar) и 124 (vertical line) соответствуют совершенно разные символы. Cимвол "broken bar" в кодировке CP1251 есть, а в CP866 его просто нет, потому и должен пропадать.
ps: Ага, вижу что Jesus Reyes именно так все и понял...
ps: Ага, вижу что Jesus Reyes именно так все и понял...
в Delphi работает иммено так 166 (broken bar) на 124 (vertical line) меняется, думаю это правильно, хотя не логично, потому что, обратное кодирование не даст начальный результат.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
...При более внимательном рассмотрении оказывается, что CharToOem вообще очень своеобразна. Видно, что там есть попытки сохранить начертание символов: "±" превращается в обычный плюс и т.п. Но вот объяснить превращение 149 в 7 я не берусь...
Т.е. там что-то M$-специфичное, имеющеe c Unicode не слишком много общего...
Так что, если требуется в точности такое же поведение, его, наверное, проще всего написать самостоятельно.
Т.е. там что-то M$-специфичное, имеющеe c Unicode не слишком много общего...
Так что, если требуется в точности такое же поведение, его, наверное, проще всего написать самостоятельно.
Sergei I. Gorelkin писал(а):Так что, если требуется в точности такое же поведение, его, наверное, проще всего написать самостоятельно.
совершенно с вами согласен, думаю я сделал ошибку написав в багтрекер, UTF8ToCP866 корректно работает с логической точки зрения. Нужное мне кодирование лучше реализовать в своей программе, и не лезть в правильно работающий код метода UTF8ToCP866.
