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

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

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

Сообщение Brainenjii » 17.06.2007 19:46:17

Спасибо!
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii » 20.07.2007 17:23:42

А можно обратную кодировку еще показать ? :)
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii » 25.07.2007 23:32:04

В общем попробовал сделать - и вроде вышло :)
Код: Выделить всё
Function Bj_UTF8ToWin1251(s: String): String;
var
  i: Integer;
  Skip: Boolean;
Begin
  Result := '';
  For i := 0 To Length(s) Do
    If Not(Skip) Then
      Begin
        Case s[i] Of
          #1..#127: Result := Result + s[i];
          #208:
            Begin
              Case s[i + 1] Of
                #129: Result := Result + #168;
                #144..#191: Result := Result + Chr(Ord(s[i + 1]) + 48);
              End;
              Skip := TRUE;
            End;
          #209:
             Begin
               Case s[i + 1] Of
                 #128..#143: Result := Result + Chr(Ord(s[i + 1]) + 112);
                 #145: Result := Result + #184;
               End;
               Skip := TRUE;
             End;
        End;
      End
    Else
      Skip := FALSE;
End;

Правда только русские буквы и символы с 1 по 127, но мне как раз это и надо :) Еще раз спасибо, tria
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение tria » 26.07.2007 11:55:38

У меня сейчас нет времени.
Надеюсь где-то через недельку занятся этим вопросом, мне тоже нужна обратная функция.
Скорее всего, немножко прооптимизирую Вашу. Хотя бы в плане:
Result := Result + s[i]
Это медленная операция.
Лучше задать всю возможную длину, а потом обрезать, как это предлагал Sergei I. Gorelkin.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение sts » 15.04.2008 09:45:59

Поднимаю тему, ибо не оставляю надежды использовать fpc и еже с ним :shock:

Значит так, добил я TOracleConnection (sqldb) на предмет русского языка (win1251), с одной стороны добавил в компонент настройку CharSetа с другой подкрутил автоматическую конвертацию в UTF8 в TStringField, точнее сделал TUTF8StringField.

ВОПРОС : а как узнать что вообще надо конверить в UTF8 ? типа IsUTF8 : boolean есть ?
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts » 15.04.2008 16:58:36

Ну дык, народ!, подскажите как стандартными средствами FPC узнать что элемент GUI типа TDBEdit требует (или не требует) от Field.AsString строку в формате UTF8?
Например когда линух собран под локаль win1251 и соответсвенно не надо конвертить данные
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение Attid » 15.04.2008 18:28:43

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

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

Сообщение Коммунар » 15.07.2008 13:29:05

Скажите, существует ли к Паскалю модуль, который занимался бы перекодировкой текста? Конкретно мне надо из utf-8 в cp-1251. Использовать тот же libiconv не хочу, так как, насколько знаю, это чисто никсовая библиотека, а я, как всегда, стремлюсь к кроссплатформенности.
Аватара пользователя
Коммунар
новенький
 
Сообщения: 13
Зарегистрирован: 04.06.2008 23:23:36
Откуда: ССКР

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

Сообщение Sergei I. Gorelkin » 15.07.2008 13:47:06

Конкретно в FPC такого модуля (пока) нет. Если говорить о Паскале вообще, то они есть, например, в составе JCL или Open XML.

libiconv прекрасно работает в Windows, особенно если использовать родную (не Cygwin/MinGW) сборку. Другое дело, она дублирует функции, которые в Windows и так есть.

Если нужно только utf8->cp1251 и ничего более, можно обойтись utf8decode() и потом табличной перекодировкой. Собственно, эта тема уже на форуме обсуждалась и, наверное, не раз.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение tria » 15.07.2008 15:34:20

Собственно, я писал такую ф-цию, где-то на форумах исходники есть - тут совместно ее дорабатывали.
Если не найдешь - могу выложить (туда и обратно)
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

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

Сообщение Коммунар » 15.07.2008 16:17:01

tria писал(а):Собственно, я писал такую ф-цию, где-то на форумах исходники есть - тут совместно ее дорабатывали.
Если не найдешь - могу выложить (туда и обратно)

Чего-то не могу найти... Сейчас попробую сам накатать, результат выложу.
Аватара пользователя
Коммунар
новенький
 
Сообщения: 13
Зарегистрирован: 04.06.2008 23:23:36
Откуда: ССКР

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

Сообщение Bupyc » 15.07.2008 16:20:45

Похоже, что обсуждение этой темы находится тут
viewtopic.php?f=5&t=3042&start=0&st=0&sk=t&sd=a&hilit=cp1251+cp866+koi8r+koi8u
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

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

Сообщение tria » 15.07.2008 17:27:27

Код: Выделить всё
function Tria_AnsiToUtf8(const s:string):string;
var i,n,j, Len:integer;
begin
  SetLength(Result,Length(s)*3);
  j:=1;
  For i:=1 to Length(s) do begin
    n:=ord(s[i]);
    Case n of //One byte and russion symbols
    1..127:
      begin
        Result[j]:=s[i];
        Inc(j);
      end;
    128: begin Result[j]:=#208;  Inc(j); Result[j]:=#130;  Inc(j);  end; //€
    129: begin Result[j]:=#208;  Inc(j); Result[j]:=#131;  Inc(j);  end; //
    130: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#154;  Inc(j);  end; //‚
    131: begin Result[j]:=#209;  Inc(j); Result[j]:=#147;  Inc(j);  end; //ƒ
    132: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#158;  Inc(j);  end; //„
    133: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#166;  Inc(j);  end; //…
    134: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#160;  Inc(j);  end; //†
    135: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#161;  Inc(j);  end; //‡
    136: begin Result[j]:=#226;  Inc(j); Result[j]:=#130;  Inc(j); Result[j]:=#172;  Inc(j);  end; //ˆ
    137: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#176;  Inc(j);  end; //‰
    138: begin Result[j]:=#208;  Inc(j); Result[j]:=#137;  Inc(j);  end; //Š
    139: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#185;  Inc(j);  end; //‹
    140: begin Result[j]:=#208;  Inc(j); Result[j]:=#138;  Inc(j);  end; //Œ
    141: begin Result[j]:=#208;  Inc(j); Result[j]:=#140;  Inc(j);  end; //
    142: begin Result[j]:=#208;  Inc(j); Result[j]:=#139;  Inc(j);  end; //Ž
    143: begin Result[j]:=#208;  Inc(j); Result[j]:=#143;  Inc(j);  end; //
    144: begin Result[j]:=#209;  Inc(j); Result[j]:=#146;  Inc(j);  end; //
    145: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#152;  Inc(j);  end; //‘
    146: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#153;  Inc(j);  end; //’
    147: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#156;  Inc(j);  end; //“
    148: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#157;  Inc(j);  end; //”
    149: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#162;  Inc(j);  end; //•
    150: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#147;  Inc(j);  end; //–
    151: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#148;  Inc(j);  end; //—
    152: begin Result[j]:=#194;  Inc(j); Result[j]:=#152;  Inc(j);  end; //˜
    153: begin Result[j]:=#226;  Inc(j); Result[j]:=#132;  Inc(j); Result[j]:=#162;  Inc(j);  end; //™
    154: begin Result[j]:=#209;  Inc(j); Result[j]:=#153;  Inc(j);  end; //š
    155: begin Result[j]:=#226;  Inc(j); Result[j]:=#128;  Inc(j); Result[j]:=#186;  Inc(j);  end; //›
    156: begin Result[j]:=#209;  Inc(j); Result[j]:=#154;  Inc(j);  end; //œ
    157: begin Result[j]:=#209;  Inc(j); Result[j]:=#156;  Inc(j);  end; //
    158: begin Result[j]:=#209;  Inc(j); Result[j]:=#155;  Inc(j);  end; //ž
    159: begin Result[j]:=#209;  Inc(j); Result[j]:=#159;  Inc(j);  end; //Ÿ
    160: begin Result[j]:=#194;  Inc(j); Result[j]:=#160;  Inc(j);  end; // 
    161: begin Result[j]:=#208;  Inc(j); Result[j]:=#142;  Inc(j);  end; //¡
    162: begin Result[j]:=#209;  Inc(j); Result[j]:=#158;  Inc(j);  end; //¢
    163: begin Result[j]:=#208;  Inc(j); Result[j]:=#136;  Inc(j);  end; //£
    164: begin Result[j]:=#194;  Inc(j); Result[j]:=#164;  Inc(j);  end; //¤
    165: begin Result[j]:=#210;  Inc(j); Result[j]:=#144;  Inc(j);  end; //¥
    166: begin Result[j]:=#194;  Inc(j); Result[j]:=#166;  Inc(j);  end; //¦
    167: begin Result[j]:=#194;  Inc(j); Result[j]:=#167;  Inc(j);  end; //§
    168: begin Result[j]:=#208;  Inc(j); Result[j]:=#129;  Inc(j);  end; //¨
    169: begin Result[j]:=#194;  Inc(j); Result[j]:=#169;  Inc(j);  end; //©
    170: begin Result[j]:=#208;  Inc(j); Result[j]:=#132;  Inc(j);  end; //ª
    171: begin Result[j]:=#194;  Inc(j); Result[j]:=#171;  Inc(j);  end; //«
    172: begin Result[j]:=#194;  Inc(j); Result[j]:=#172;  Inc(j);  end; //¬
    173: begin Result[j]:=#194;  Inc(j); Result[j]:=#173;  Inc(j);  end; //­
    174: begin Result[j]:=#194;  Inc(j); Result[j]:=#174;  Inc(j);  end; //®
    175: begin Result[j]:=#208;  Inc(j); Result[j]:=#135;  Inc(j);  end; //¯
    176: begin Result[j]:=#194;  Inc(j); Result[j]:=#176;  Inc(j);  end; //°
    177: begin Result[j]:=#194;  Inc(j); Result[j]:=#177;  Inc(j);  end; //±
    178: begin Result[j]:=#208;  Inc(j); Result[j]:=#134;  Inc(j);  end; //²
    179: begin Result[j]:=#209;  Inc(j); Result[j]:=#150;  Inc(j);  end; //³
    180: begin Result[j]:=#210;  Inc(j); Result[j]:=#145;  Inc(j);  end; //´
    181: begin Result[j]:=#194;  Inc(j); Result[j]:=#181;  Inc(j);  end; //µ
    182: begin Result[j]:=#194;  Inc(j); Result[j]:=#182;  Inc(j);  end; //¶
    183: begin Result[j]:=#194;  Inc(j); Result[j]:=#183;  Inc(j);  end; //·
    184: begin Result[j]:=#209;  Inc(j); Result[j]:=#145;  Inc(j);  end; //¸
    185: begin Result[j]:=#226;  Inc(j); Result[j]:=#132;  Inc(j); Result[j]:=#150;  Inc(j);  end; //¹
    186: begin Result[j]:=#209;  Inc(j); Result[j]:=#148;  Inc(j);  end; //º
    187: begin Result[j]:=#194;  Inc(j); Result[j]:=#187;  Inc(j);  end; //»
    188: begin Result[j]:=#209;  Inc(j); Result[j]:=#152;  Inc(j);  end; //¼
    189: begin Result[j]:=#208;  Inc(j); Result[j]:=#133;  Inc(j);  end; //½
    190: begin Result[j]:=#209;  Inc(j); Result[j]:=#149;  Inc(j);  end; //¾
    191: begin Result[j]:=#209;  Inc(j); Result[j]:=#151;  Inc(j);  end; //¿

    192..239://'À'..'ï'
      begin
        Result[j]:=#208;  Inc(j);
        Result[j]:=Char(n-48);  Inc(j);
      end;
    240..255://'ð'..'ÿ'
      begin
        Result[j]:=#209;  Inc(j);
        Result[j]:=Char(n-112);  Inc(j);
      end;
    end;//Case
  end;

SetLength(Result,j-1);
end;



Код: Выделить всё
function Tria_Utf8ToAnsi(const s:string):string;
var i,n,j, Len:integer;
begin
  SetLength(Result,Length(s));
  j:=1; i:=1;
  While i<=Length(s) do begin
    Case s[i] of
    #1..#127://One byte and latin symbols
      begin
        Result[j]:=s[i];
      end;
    #194: begin
        Inc(i);
        Result[j]:=s[i];
      end;
    #208: begin
        Inc(i); //n:=ord(s[i]);
        Case s[i] of
        #129: Result[j]:=#168; //¨
        #130: Result[j]:=#128; //€
        #131: Result[j]:=#129; //
        #132: Result[j]:=#170; //ª
        #133: Result[j]:=#189; //½
        #134: Result[j]:=#178; //²
        #135: Result[j]:=#175; //¯
        #136: Result[j]:=#163; //£
        #137: Result[j]:=#138; //Š
        #138: Result[j]:=#140; //Œ
        #139: Result[j]:=#142; //Ž
        #140: Result[j]:=#141; //
        #142: Result[j]:=#161; //¡
        #143: Result[j]:=#143; //
        #144..#191:begin
          n:=ord(s[i]);
          Result[j]:=Char(n+48);//'À'..'ï'
                   end;
        end;
      end;
    #209: begin
        Inc(i);
        Case s[i] of
        #128..#143:begin
           n:=ord(s[i]);
           Result[j]:=Char(n+112);//'ð'..'ÿ'
                 end;
        #145: Result[j]:=#184;  //¸
        #146: Result[j]:=#144;  //
        #147: Result[j]:=#131;  //ƒ
        #148: Result[j]:=#186;  //º
        #149: Result[j]:=#190;  //¾
        #150: Result[j]:=#179;  //³
        #151: Result[j]:=#191;  //¿
        #152: Result[j]:=#188;  //¼
        #153: Result[j]:=#154;  //š
        #154: Result[j]:=#156;  //œ
        #155: Result[j]:=#158;  //ž
        #156: Result[j]:=#157;  //
        #158: Result[j]:=#162;  //¢
        #159: Result[j]:=#159;  //Ÿ
        end;
      end;
    #210: begin
        Inc(i);
        Case s[i] of
        #144: Result[j]:=#165;  //¥
        #145: Result[j]:=#180;  //´
        end;
      end;
    #226: begin
        Inc(i);
        Case s[i] of
        #128:begin
          Inc(i);
          Case s[i] of
          #147: Result[j]:=#150; //–
          #148: Result[j]:=#151; //—
          #152: Result[j]:=#145; //‘
          #153: Result[j]:=#146; //’
          #154: Result[j]:=#130; //‚
          #156: Result[j]:=#147; //“
          #157: Result[j]:=#148; //”
          #158: Result[j]:=#132; //„
          #160: Result[j]:=#134; //†
          #161: Result[j]:=#135; //‡
          #162: Result[j]:=#149; //•
          #166: Result[j]:=#133; //…
          #176: Result[j]:=#137; //‰
          #185: Result[j]:=#139; //‹
          #186: Result[j]:=#155; //›
          end;
            end;
        #130:begin
          Inc(i);
          Result[j]:=#136;//#172;  //ˆ
            end;
        #132:begin
          Inc(i);
          Case s[i] of
          #150: Result[j]:=#185; //¹
          #162: Result[j]:=#153; //™
          end;
            end;
         end;//Case
      end;
    end;
    Inc(j); Inc(i);
  end;//While

SetLength(Result,j-1);
end;


Добавлено спустя 1 минуту 8 секунд:
Если найдете ошибку - не забудьте сообщить пожалуйста!
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

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

Сообщение B4rr4cuda » 15.07.2008 20:36:26

tria
Может немного дооформить и в фак? Или хотя бы в блог, чтоб не потерялась.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

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

Сообщение Коммунар » 15.07.2008 22:09:07

tria
Вариант с оператором выбора шибко медленный, это дело лучше в массив запихнуть и извлекать по индексу.
Аватара пользователя
Коммунар
новенький
 
Сообщения: 13
Зарегистрирован: 04.06.2008 23:23:36
Откуда: ССКР

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru