В Delphi 2006 для перекодировки DOS-текста в WINDOWS-кодировку использовал функцию:
//ПЕРЕКОДИРОВКА ИЗ DOS В WINDOS
function TChRichEdit.ChDosToWin(s:String):String ;
Var i:Integer;
begin
For i:=1 To Length(s) Do
Begin
if s[i] in [#128..#175] then
s[i]:=CHR(ORD(s[i])+64)
else if s[i] in [#224..#239] then
s[i]:=CHR(ORD(s[i])+16)
else if s[i] in [#240..#249] then
case s[i] of
#248: s[i] := #170;//Є Є
#249: s[i] := #186; //є
#246: s[i] := #175; // Ї 175
#247: s[i] := #191; // ї 191
#243: s[i] := #179; // _ 179
#242: s[i] := #178; // _ 178
#241: s[i] := #184; // ё 184
#240: s[i] := #168; // Ё 168
end;
End;
Result:=s;
end;
Поставил для ознакомления Delphi 2009. Функция перестала перекодировать.
ORD(s[i]) возвращает совсем другие значения.
Например слово "Адрес" в dos-кодировке приходит в оба Delphi в виде 'Ђ¤аҐб'
ORD(s[1])=1026
ORD(s[2])=164
ORD(s[3])=1072
ORD(s[4])=1168
ORD(s[5])=1073
На юникод не очень похоже, хотя явно в юникоде причина.
Что скажете?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
21-01-2009 04:23 | Сообщение от автора вопроса
Да, спасибо все работает. Украинские символы тоже отображаются.
Перев?рка української мови:
??, Її, Єє
Правда вместо украинской буквы i-?. Но возможно это проблемы Win Vista.
Хорошо бы для чистоты эксперимента повторить самописанную перекодировку, но в
юникод-варианте. Нужна функция, которая возвращает Юникод символа.
Я в свое время написал ф-ю(delphi 2006), которая в RichEdit открывает файл MS WORD.
Там и решалась задача перехода от юникода к реальному символу.
Не касаясь ответа конкретно на этот вопрос, хотел бы всё-таки обратить внимание почтенной публики на следующий момент: очень долго большинство здесь присутствующих работали в основном со строками однобайтовых символов и за это время выработали много привычек и приёмов, которые давали надёжные рультаты всё это время. Однако, с появлением Delphi2009 ситуация изменилась. Теперь привычные String стали строками двухбайтовых символов и некоторые старые подходы стали неприменимы в новых условиях. Например, одним из любимых многими приёмов является проверка вхождения символа в множество. Однако множество работает только с диапазоном 0..255 и в Delphi2009 этим приёмом пользоваться уже нельзя. И таких моментов может быть достаточно много (например, в связи с размерами буферов, вычисляемыми из предположения, что SizeOf(Char) = 1). Пока на Delphi 2009 вряд ли перешло много народа, но такая перспектива вполне реальна. Я хотел бы призвать народ заранее проанализировать ситуацию, отказаться от потенциально проблемных вариантов и перейти на решения, которые не вызовут впоследствии проблем при переходе на Delphi2009...
20-01-2009 14:16 | Комментарий к предыдущим ответам
Пардон, не проверил предыдущий код. Надо так:
type
OEMString = type AnsiString($866);
function ChDosToWin(s: RawByteString): String;
begin
SetCodePage(s, 866, false);
Result := s;
end;
Хотя в некоторых случаях проще просто указать какую кодировку принимает функция.
А как быть с украинскими символами?
Пишет, что в 866 они отсутствуют, нужна другая кодировка.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.