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

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

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

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

Сообщение tria »

Это про CASE?
Где-то я читал, что если значения идут строго по возрастанию или убыванию, то он и так работает как индексный поиск.
Хотя через массив мож и быстрее будет. Как грится - переделайте, сравните оба варианта, будем пользоваться более скоростным :)
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

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;
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

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

Сообщение alex208210 »

tria, Attid спасибо.. очень пригодились все три функции.. работают отлично!
по поводу транслита.. может все таки стоит переделать в вывод значения функции транслитированную строку а не код ошибки?
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

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

Модуль называется "lconvencoding".
Функция -

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

function UTF8ToCP1251(const s: string): string; // cyrillic
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

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

Спасибо!!! Млин а я время потерял, пока сам писал перекодировки :(
alex208210
постоялец
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Сообщение alex208210 »

Attid, в линуксе Utf8ToTranslit работает нормально, в винде нет. при обработке строки выдает сообщение об ошибке EinOutError file not open. В редакторе кода строка ошибки стоит на первом writeln(InString[i]);
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

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

Удалите WriteLn.
alex208210
постоялец
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Сообщение alex208210 »

Работает)) Mr.Smart Спасибо!
kolyacher
незнакомец
Сообщения: 2
Зарегистрирован: 28.03.2016 14:34:01

Сообщение kolyacher »

svk12, огромное спасибо!!! выручил!!!
Ответить