Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:10[Войти] | [Зарегистрироваться]
Ответ на вопрос № 67996

20-01-2009 12:45
В 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
На юникод не очень похоже, хотя явно в юникоде причина.
Что скажете?

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

21-01-2009 04:23 | Сообщение от автора вопроса
Да, спасибо все работает. Украинские символы тоже отображаются.
Перев?рка української мови:
??, Її, Єє
Правда вместо украинской буквы i-?. Но возможно это проблемы Win Vista.
Хорошо бы для чистоты эксперимента повторить самописанную перекодировку, но в
юникод-варианте. Нужна функция, которая возвращает Юникод символа.
Я в свое время написал ф-ю(delphi 2006), которая в RichEdit открывает файл MS WORD.
Там и решалась задача перехода от юникода к реальному символу.

20-01-2009 16:26
Не касаясь ответа конкретно на этот вопрос, хотел бы всё-таки обратить внимание почтенной публики на следующий момент: очень долго большинство здесь присутствующих работали в основном со строками однобайтовых символов и за это время выработали много привычек и приёмов, которые давали надёжные рультаты всё это время. Однако, с появлением 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 они отсутствуют, нужна другая кодировка.

20-01-2009 13:57
А как быть с украинскими символами?

20-01-2009 13:40
Так D2009 сама же должна переводить? Как то так:

function TChRichEdit.ChDosToWin(s: RawByteString): String;
type OEMString = AnsiString($866);
begin
  Result := OEMString(s);
end;


20-01-2009 12:47
Лучше не самописные перекодировщики делать, а использовать готовую системную функцию CharToOem - она есть и в ANSI-, и в Unicode-варианте.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жил-был у бабушки серенький КТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования