Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перекодировка из cp1251 в koi-8r и обратно 
:(
    Опции темы
hente
Дата 24.6.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Использую следующие два массива:
Код

unsigned char WinKoi[]={
  128,129,130,131,132,133,134,135,136,137,060,139,140,141,142,143,
  144,145,146,147,148,169,150,151,152,153,154,062,176,157,183,159,
  160,246,247,074,164,231,166,167,179,169,180,060,172,173,174,183,
  156,177,073,105,199,181,182,158,163,191,164,062,106,189,190,167,
  225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
  242,243,244,245,230,232,227,254,251,253,154,249,248,252,224,241,
  193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
  210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209};


unsigned char KoiWin[]={
  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  144,145,146,147,148,149,150,151,152,153,218,155,176,157,183,159,
  160,161,162,184,186,165,166,191,168,169,170,171,172,173,174,175,
  156,177,178,168,170,181,182,175,184,185,186,187,188,189,190,185,
  254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
  239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
  222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
  207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218 };


и собсно сама функция:

Код

AnsiString KoiToWin(AnsiString OldStr){
AnsiString NewStr;
        char *f;
        f=new char[OldStr.Length()];

        for(unsigned int i=0;i<OldStr.Length();i++){
                f[i]=OldStr.c_str()[i];
                if( f[i]>127)
                        f[i]=KoiWin[f[i]-126];
                }
        NewStr=(char*)f;
        delete f;
        return NewStr;
        }


нифига не переводит....может кто еще какие варианты подскажет?
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
586
Дата 24.6.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(hente @  24.6.2009,  12:00 Найти цитируемый пост)
f=new char[OldStr.Length()];

Должно быть:
Код
f=new char[OldStr.Length()+1];


Цитата(hente @  24.6.2009,  12:00 Найти цитируемый пост)
f[i]=OldStr.c_str()[i];
Код
f[i]=OldStr[i+1];


Цитата(hente @  24.6.2009,  12:00 Найти цитируемый пост)
нифига не переводит

Возможно в коде:
Цитата
                if( f[i]>127)
                        f[i]=KoiWin[f[i]-126];

Должно быть 128, а не 126.
PM   Вверх
xvr
Дата 24.6.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата

может кто еще какие варианты подскажет? 
Вариант - воспользоваться 2 функциями
Код

MultiByteToWideChar(20866,...)
WideCharToMultiByte(CP_1251,...)

PM MAIL   Вверх
hente
Дата 24.6.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



MultiByteToWideChar(20866,...)
WideCharToMultiByte(CP_1251,...)
Цитата

MultiByteToWideChar(20866,...)
WideCharToMultiByte(CP_1251,...)

а можно по подробней про эти функции плизззз
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
xvr
Дата 24.6.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



В MSDN все подробно расписанно. Если вкратце, то
  •  MultiByteToWideChar переводит из char* (в заданной кодовой таблице, 20866 - это КОИ8) в Unicode
  •  WideCharToMultiByte переводит из Unicode в char* в заданной кодовой таблице
В MSDN есть примеры использования


PM MAIL   Вверх
hente
Дата 24.6.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



плиз...а параметры у этих функций можно?
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
hente
Дата 24.6.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Короче сделал так:
Код
      
AnsiString KoiToWin(AnsiString OldStr){

        AnsiString NewStr;
        WCHAR *buffer;
        buffer =new WCHAR[OldStr.Length()];
        MultiByteToWideChar(1251, 0, OldStr.c_str(), OldStr.Length() + 1,
                             buffer, OldStr.Length());
        NewStr= buffer;
        delete buffer;
        return NewStr;
        }

AnsiString WinToKoi(AnsiString OldStr){

        AnsiString NewStr;
        WCHAR *buffer;
        buffer =new WCHAR[OldStr.Length()];
        MultiByteToWideChar(20866, 0, OldStr.c_str(), OldStr.Length() + 1,
                             buffer, OldStr.Length());
        NewStr= buffer;
        delete buffer;
        return NewStr;
        }


из windos-1251 в Koi-8r переводит (т.е. ф-яWinToKoi(AnsiString OldStr) ), а вот обратно ф-я KoiToWin ну никак не хочет...Выдает тока ироглифы:((
В чем может быть проблема?

Это сообщение отредактировал(а) hente - 24.6.2009, 13:31
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
Alca
Дата 24.6.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

function Win2Koi(const S: AnsiString): AnsiString;
const
  W: AnsiString = 'абвгдеёжзийклмнопрс=уфхчцшщьыъэЭя+--+-+ЁЖЗ++--Э-+ПРСТУФiЧЦШ+_Э+ЭЮо';
  K: AnsiString = '--ЧЗ-+ЈЦ++--Э-+ПРТУФiЖ+Ю+ЭЭШ+о_+СбвчздеЭцъйклмнопр=уфхжиЭгыэшщяьас';
var
  I, J: Integer;
begin
  Result := S;
  for I := 1 to Length(Result) do
  begin
    J := Pos(Result[I], W);
    if J > 0 then
      Result[I] := K[J];
  end;
end;



--------------------
PM WWW ICQ Skype Jabber   Вверх
hente
Дата 24.6.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



мона пояснить что эт такое?
Код

  W: AnsiString = 'абвгдеёжзийклмнопрс=уфхчцшщьыъэЭя+--+-+ЁЖЗ++--Э-+ПРСТУФiЧЦШ+_Э+ЭЮо';
  K: AnsiString = '--ЧЗ-+ЈЦ++--Э-+ПРТУФiЖ+Ю+ЭЭШ+о_+СбвчздеЭцъйклмнопр=уфхжиЭгыэшщяьас';


вернее почему там не полный алфавит? остальное вроде все ясно
--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
xvr
Дата 24.6.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(hente @ 24.6.2009,  13:30)
Короче сделал так:

Для перевода нужно использовать 2 функции:
Код

AnsiString decode(int from, int to, AnsiString OldStr){

        WCHAR *buffer;
        buffer =new WCHAR[OldStr.Length()+1];
        MultiByteToWideChar(from, 0, OldStr.c_str(), OldStr.Length(),
                             buffer, OldStr.Length()+1);

        WideCharToMultiByte(to,0,buffer,-1,OldStr.c_str(),OldStr.Length()+1,NULL,NULL);
        delete buffer;
        return OldStr;
        }


Использование:
Код

// win -> koi
AnsiString s=decode(CP_1251,20866,org_str);

// koi -> win
AnsiString s=decode(20866,CP_1251,org_str);


PM MAIL   Вверх
hente
Дата 25.6.2009, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.3.2009
Где: Томск

Репутация: нет
Всего: нет



Спасибо огромное господа!!! Вот тока (+1 кдлене нало поубирать)

Код

AnsiString decode(int from, int to, AnsiString OldStr){

        WCHAR *buffer;
        buffer =new WCHAR[OldStr.Length()];
        MultiByteToWideChar(from, 0, OldStr.c_str(), OldStr.Length(),
                             buffer, OldStr.Length());

        WideCharToMultiByte(to,0,buffer,-1,OldStr.c_str(),OldStr.Length(),NULL,NULL);
        delete buffer;
        return OldStr;
        }


// win -> koi
AnsiString s=decode(CP_1251,20866,org_str);

// koi -> win
AnsiString s=decode(20866,CP_1251,org_str);


--------------------
  долой быдло кодеров!!!
PM MAIL   Вверх
Alca
Дата 25.6.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



delete buffer -> delete [] buffer


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 8.7.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

Error    1    error C2065: 'CP_1251' : undeclared identifier

У меня VS 2008.  smile

Добавлено через 11 минут и 18 секунд
CP_1251  ->  1251
http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx


--------------------
PM WWW ICQ Skype Jabber   Вверх
s1lver
Дата 11.7.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 14.12.2007
Где: Россия

Репутация: нет
Всего: нет



А как применить эти функции к конкретному тексту?


--------------------
Я собрался жить вечно - пока все идет нормально!
PM MAIL ICQ   Вверх
Alca
Дата 11.7.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Цитата

А как применить эти функции к конкретному тексту?

А что не ясно?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.