Как перекодировать из 1251 в utf8 "на лету"?

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

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

Re: Модуль для перекодирования

Сообщение tria » 16.07.2008 14:57:57

Это про CASE?
Где-то я читал, что если значения идут строго по возрастанию или убыванию, то он и так работает как индексный поиск.
Хотя через массив мож и быстрее будет. Как грится - переделайте, сравните оба варианта, будем пользоваться более скоростным :)
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение Attid » 07.09.2008 19:31:23

tria

нашел багу

Код: Выделить всё
    #209: begin
        Inc(i);
        Case s[i] of
        #128..#143:begin
           n:=ord(s[i]);
           Result[j]:=Char(n+112);//'р'..'я'
                 end;


у тебя там начинается с #138 и ты теряешь буквы "р"-"щ"

Добавлено спустя 3 минуты 27 секунд:
ну еще добавлю от себя в топик Utf8ToTranslit только русские буквы

Код: Выделить всё
function Utf8ToTranslit(var Text: string): boolean;
var InString: string;
    OutString: string;
    b: string;
    i, Len: integer;
begin
  Result:=true;
  InString:=Text;
  OutString := '';
  Len:=Length(InString);
  i := 1;
  try
    repeat
      writeln(InString[i]);
      writeln(ord(InString[i]));
      if InString[i]  = #208 then
      begin
        inc(i);
        writeln(InString[i]);
        writeln(ord(InString[i]));
        case InString[i] of
          #176: b:='a'; #177: b:='b'; #178: b:='v'; #179: b:='g'; #180: b:='d'; #181: b:='e';
          #182: b:='zh'; #183: b:='z'; #184: b:='i'; #185: b:='i'; #186: b:='k'; #187: b:='l';
          #188: b:='m'; #189: b:='n'; #190: b:='o'; #191: b:='p';

          #144: b:='A'; #145: b:='B'; #146: b:='V'; #147: b:='G'; #148: b:='D'; #149: b:='E';
          #129: b:='E';
          #150: b:='ZH';#151: b:='Z'; #152: b:='I'; #153: b:='I'; #154: b:='K'; #155: b:='L'; #156: b:='M'; #157: b:='N';
          #158: b:='O'; #159: b:='P'; #160: b:='R'; #161: b:='S'; #162: b:='T'; #163: b:='U'; #164: b:='F'; #165: b:='H';
          #166: b:='C'; #167: b:='CH';#168: b:='SH';#169:b:='SCH';#170: b:='`'; #171: b:='U'; #172: b:='`'; #173: b:='E';
          #174: b:='U'; #175: b:='YA';
        else b:='?';
        end;
      end
      else
      if InString[i]  = #209 then
      begin
        inc(i);
        writeln(InString[i]);
        writeln(ord(InString[i]));
        case InString[i] of
          #128: b:='r'; #129: b:='s'; #130: b:='t'; #131: b:='u'; #132: b:='f';
          #133: b:='h'; #134: b:='c'; #135: b:='ch';#136: b:='sh';#137: b:='sch';
          #138: b:='`'; #139: b:='u'; #140: b:='`'; #141: b:='e'; #142: b:='u';
          #143: b:='ya';#145: b:='e';
        else b:='?';
        end;
      end
      else
        b := InString[i];
      inc(i);
      OutString:=OutString+b
    until i>Len;

    Text:=OutString;
  except
    Result:=false
  end
end;
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение tria » 08.09.2008 12:46:51

Спасибо, исправил.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение alex208210 » 22.05.2011 17:37:27

tria, Attid спасибо.. очень пригодились все три функции.. работают отлично!
по поводу транслита.. может все таки стоит переделать в вывод значения функции транслитированную строку а не код ошибки?
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение svk12 » 22.05.2011 21:11:23

Скажите, существует ли к Паскалю модуль, который занимался бы перекодировкой текста? Конкретно мне надо из utf-8 в cp-1251.

Модуль называется "lconvencoding".
Функция -
Код: Выделить всё
function UTF8ToCP1251(const s: string): string; // cyrillic
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение VirtUX » 23.05.2011 10:15:36

svk12 писал(а):Модуль называется "lconvencoding".

Спасибо!!! Млин а я время потерял, пока сам писал перекодировки :(
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение alex208210 » 23.05.2011 21:42:33

Attid, в линуксе Utf8ToTranslit работает нормально, в винде нет. при обработке строки выдает сообщение об ошибке EinOutError file not open. В редакторе кода строка ошибки стоит на первом writeln(InString[i]);
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение Mr.Smart » 23.05.2011 22:12:16

Удалите WriteLn.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение alex208210 » 23.05.2011 22:27:00

Работает)) Mr.Smart Спасибо!
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Как перекодировать из 1251 в utf8 "на лету"?

Сообщение kolyacher » 28.03.2016 15:37:19

svk12, огромное спасибо!!! выручил!!!
kolyacher
незнакомец
 
Сообщения: 2
Зарегистрирован: 28.03.2016 15:34:01

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru