C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
utf8 to win1251, Как?
_NIK_
Отправлено: 04.03.2006, 17:50


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Подскажите как переконвертить utf8 текст в win1251, можно код для билдера или может компоненты есть какие-нить.У меня функция есть, но там параметр nlString — билдер не знает его
sad.gif
xTrim
Отправлено: 05.03.2006, 21:27


Машинист паровоза

Группа: Участник
Сообщений: 208



CODE

ListBox1->Items->Clear();
ListBox2->Items->Clear();
if (OpenDialog1->Execute())
 ListBox1->Items->LoadFromFile(OpenDialog1->FileName);

ListBox2->Items->BeginUpdate();

for (int i = 0; i != ListBox1->Items->Count; i++)
{
 AnsiString st = ListBox1->Items->Strings[i];
 unsigned char * pBuffer = st.c_str();
 int nWideLength = MultiByteToWideChar(CP_UTF8, 0, (const char*) pBuffer, -1,
      NULL, 0);
 wchar_t* ws = new wchar_t[nWideLength];
 MultiByteToWideChar(CP_UTF8, 0, (const char *) pBuffer, -1, ws, nWideLength);
 AnsiString ss = AnsiString(ws);
 ListBox2->Items->Add(ss);
 delete [] ws;
}
ListBox2->Items->EndUpdate();
ListBox2->Items->SaveToFile(OpenDialog1->FileName + ".win");
_NIK_
Отправлено: 05.03.2006, 22:46


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Пасиб, попробую...
_NIK_
Отправлено: 05.03.2006, 22:48


Дежурный стрелочник

Группа: Участник
Сообщений: 55



И еще,xTrim,подскажи как узнать кодировку файла
_NIK_
Отправлено: 06.03.2006, 02:21


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Короче, вот код и он почему-то не работает, может кто-нить увидит ошибку sad.gif sad.gif sad.gif :

CODE


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MainDlg.h"
#include "string.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}
//---------------------------------------------------------------------------
bool UTF82String(const char* autf8Str, int anLen, AnsiString &asStr){
asStr = "";

if (anLen == -1){
 anLen = strlen(autf8Str);
}
       asStr.SetLength(anLen);
unsigned uLength;
char chTemp;
for (; *autf8Str != '<!--POST BOX-->' && anLen > 0; anLen--){
 wchar_t wch;
 if ((*autf8Str & 0x80) == 0){
  wch = *autf8Str;
  autf8Str++;
 }else{
  // Calculate bits
  //chTemp = (char)0xF0;
  if ((*autf8Str & 0xF0) == 0xF0){
   uLength = 4; chTemp = (char) 0xF0;
  }
  else if ((*autf8Str & 0xE0) == 0xE0){
   uLength = 3; chTemp = (char) 0xE0;
  }
  else if ((*autf8Str & 0xC0) == 0xC0){
   uLength = 2; chTemp = (char) 0xC0;
  }
  else
   return false;

  // Build character
  // The first byte needs to clear part that has count of bytes for the UTF8 character.
  // This is done by clearing the number bits for each byte + 1 from right that the character
  // are taken.
  // Then we shift the final character one octal bitlenght for each byte that is added.
  uLength--;
  wch = (*autf8Str & ~chTemp) << (uLength * 6);

  autf8Str++; uLength--;
  wch |= (*autf8Str & 0x3F) << (uLength * 6);
  if (uLength){
   autf8Str++; uLength--;
   wch |= (*autf8Str & 0x3F) << (uLength * 6);
   if (uLength){
    autf8Str++; uLength--;
    wch |= (*autf8Str & 0x3F);
   }
  }
  autf8Str++;
 }
 asStr.operator += (wch);
}
return true;
}
//---------------------------------------------------------------------------
__fastcall Utf8Encode(AnsiString InputDir, AnsiString Maska = "*.*")
{
 TSearchRec sr;
 if (FindFirst(InputDir + "\" + Maska, faAnyFile, sr) == 0)
   {
     do
       {
         if ((sr.Name != ".")&&(sr.Name != ".."))
         {
           if (sr.Attr == faDirectory)
             {
               Application->ProcessMessages();
               Utf8Encode(InputDir + "\" + sr.Name);
             }
           else
             {
             if (DirectoryExists(InputDir + "\" + sr.Name))
               {
                 Application->ProcessMessages();
                 Utf8Encode(InputDir + "\" + sr.Name);
               }
             else
               {
                 Application->ProcessMessages();
                 Form1->StatusBar1->Panels->Items[0]->Text = sr.Name;
                 Form1->StatusBar1->Panels->Items[2]->Text = Form1->StatusBar1->Panels->Items[2]->Text.ToInt() + 1;
                 TStringList * MyList = new TStringList;
                 try
                   {
                     MyList->LoadFromFile(InputDir + "\" + sr.Name);
                     for (int i = 0; i < MyList->Count; i++)
                       {
                         AnsiString ss;
                         UTF82String((const char*)MyList->operator [](i).c_str(), -1, ss);
                         MyList->operator [](i) = ss;
                       }
                     MyList->SaveToFile(InputDir + "\" + sr.Name);
                   }
                 catch(Exception &eX)
                   {
                     ShowMessage(eX.Message);
                     delete MyList;
                   }
                }
             }
         }
       } while (FindNext(sr) == 0);
     FindClose(sr);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 StatusBar1->Panels->Items[1]->Text = "0";
 StatusBar1->Panels->Items[2]->Text = "0";
 StatusBar1->Panels->Items[0]->Text = "Scanning...";
 if (Edit1->Text == "") Edit1->Text = "*.*";
 Utf8Encode(Form1->DirectoryListBox1->Directory, Edit1->Text);
 StatusBar1->Panels->Items[0]->Text = "Ready";
}
//---------------------------------------------------------------------------


В блоке try вызывается процедура UTF82String и она не пашет, один раз сработала, а потом никак sad.gif sad.gif sad.gif

Отредактировано _NIK_ — 06/03/2006, 02:23
_NIK_
Отправлено: 06.03.2006, 12:50


Дежурный стрелочник

Группа: Участник
Сообщений: 55



QUOTE (xTrim @ 05/03/2006, 21:27)
CODE

ListBox1->Items->Clear();
ListBox2->Items->Clear();
if (OpenDialog1->Execute())
 ListBox1->Items->LoadFromFile(OpenDialog1->FileName);

ListBox2->Items->BeginUpdate();

for (int i = 0; i != ListBox1->Items->Count; i++)
{
 AnsiString st = ListBox1->Items->Strings[i];
 unsigned char * pBuffer = st.c_str();
 int nWideLength = MultiByteToWideChar(CP_UTF8, 0, (const char*) pBuffer, -1,
      NULL, 0);
 wchar_t* ws = new wchar_t[nWideLength];
 MultiByteToWideChar(CP_UTF8, 0, (const char *) pBuffer, -1, ws, nWideLength);
 AnsiString ss = AnsiString(ws);
 ListBox2->Items->Add(ss);
 delete [] ws;
}
ListBox2->Items->EndUpdate();
ListBox2->Items->SaveToFile(OpenDialog1->FileName + ".win");

Не работает!Оставляет все так как было sad.gif
_NIK_
Отправлено: 07.03.2006, 14:15


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Откликнитесь, кто-нить!!
Как это сделать? sad.gif
xTrim
Отправлено: 07.03.2006, 21:34


Машинист паровоза

Группа: Участник
Сообщений: 208



Если это не работает то все.

User Attached Image Скачать файл
UTFConverter_xTrim__060308_003339_.zip


_NIK_
Отправлено: 09.03.2006, 01:37


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Скачал, попробую!
** _NIK_
Отправлено: 09.03.2006, 14:24


Не зарегистрирован







QUOTE (xTrim @ 07/03/2006, 21:34)
Если это не работает то все.

У меня такой результат тыщу раз получался.Не работает!
Скармливаю проге HTML-страничку, написанную в utf8 кодировке, она возвращает файлик размером в 1кб против 12кб начального. Что самое интересное в нем только два знака — угловая скобка и пробел, но зато в win- кодировке sad.gif sad.gif sad.gif
xTrim
Отправлено: 09.03.2006, 21:23


Машинист паровоза

Группа: Участник
Сообщений: 208



У меня все работает как часы. Запакуй и кинь сюда страничку.
_NIK_
Отправлено: 09.03.2006, 23:31


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Ок, держи...
_NIK_
Отправлено: 09.03.2006, 23:35


Дежурный стрелочник

Группа: Участник
Сообщений: 55



wink.gif

User Attached Image Скачать файл
test2.zip


_NIK_
Отправлено: 09.03.2006, 23:42


Дежурный стрелочник

Группа: Участник
Сообщений: 55



QUOTE (xTrim @ 09/03/2006, 21:23)
У меня все работает как часы. Запакуй и кинь сюда страничку.

Пардон!!!
Работает!!!
xTrim, что значат методы BeginUpdate и EndUpdate??
xTrim
Отправлено: 10.03.2006, 23:55


Машинист паровоза

Группа: Участник
Сообщений: 208



НачатьИзменнения, ЗакончитьИзменения. т.е. ЛистБокс не будет перерисовываться в этом промежутке. А вообще то учим английский, читаем хелп.
_NIK_
Отправлено: 12.03.2006, 00:40


Дежурный стрелочник

Группа: Участник
Сообщений: 55



QUOTE (xTrim @ 10/03/2006, 23:55)
НачатьИзменнения, ЗакончитьИзменения. т.е. ЛистБокс не будет перерисовываться в этом промежутке. А вообще то учим английский, читаем хелп.

Прочитал. Но по нему не понятно когда надо использовать ИХ, а когда нет.

p.s. Глянь мой топик — "TStringList — еб...ый TStringList"

Вернуться в Вопросы программирования в C++Builder