_NIK_ |
Отправлено: 04.03.2006, 17:50 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 55
|
Подскажите как переконвертить utf8 текст в win1251, можно код для билдера или может компоненты есть какие-нить.У меня функция есть, но там параметр nlString — билдер не знает его
|
|
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
|
Короче, вот код и он почему-то не работает, может кто-нить увидит ошибку :
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 и она не пашет, один раз сработала, а потом никак
Отредактировано _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");
|
|
Не работает!Оставляет все так как было
|
|
_NIK_ |
Отправлено: 07.03.2006, 14:15 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 55
|
Откликнитесь, кто-нить!!
Как это сделать?
|
|
xTrim |
Отправлено: 07.03.2006, 21:34 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
Если это не работает то все.
|
|
_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- кодировке |
|
xTrim |
Отправлено: 09.03.2006, 21:23 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
У меня все работает как часы. Запакуй и кинь сюда страничку.
|
|
_NIK_ |
Отправлено: 09.03.2006, 23:31 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 55
|
Ок, держи...
|
|
_NIK_ |
Отправлено: 09.03.2006, 23:35 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 55
|
|
|
_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"
|
|