Кодировка ClientDataSet SaveToFile
От: Аноним  
Дата: 19.12.05 14:55
Оценка:
Привет Всем!

Существует ли все-таки возможность задать кодировку WIN1251
для метода SaveToFile из ClientDataSet?

С уважением,
Андрей.
Re: Кодировка ClientDataSet SaveToFile
От: Аноним  
Дата: 19.12.05 20:40
Оценка:
Подскажите хотя бы направление куда двигаться

Проблема в том, что после записи содержимого ClientDataSet
с помощью метода SaveToFile получается файл в кодировке UTF-8.
А нужна WIN1251. Сам вижу два возможных пути:

1. Может быть просто взять и перекодировать этот файл вручную?
2. Или как-то использовать TXMLDocument.Encoding?


А>Привет Всем!

А> Существует ли все-таки возможность задать кодировку WIN1251
А> для метода SaveToFile из ClientDataSet?
А>С уважением,
А>Андрей.
Re[2]: Кодировка ClientDataSet SaveToFile
От: АТ Россия  
Дата: 21.12.05 11:32
Оценка:
Это можно сделать так:

saveClientDataSetToWin1251EncodedFile
(
    TCustomClientDataSet* dataSet,
    const String fileName
)
{
    int size;
    char* buffer;
    TFileStream* fileStream;
    TMemoryStream* memoryStream;
    AnsiString string;
    WideString wideString;

    try
    {
        memoryStream = new TMemoryStream();
        dataSet->SaveToStream(memoryStream, dfXMLUTF8);
        size = memoryStream->Size;
        memoryStream->Position = 0;

        string.SetLength(size);
        memoryStream->Read(string.c_str(), string.Length());

        string = AnsiReplaceStr
            (string, "encoding=\"UTF-8\"","encoding=\"windows-1251\"");

        size = MultiByteToWideChar(CP_UTF8, 0, string.c_str(), -1, 0, 0);
        wideString.SetLength(size);
        MultiByteToWideChar(CP_UTF8, 0, string.c_str(), -1,
            wideString.c_bstr(), size);

        size = WideCharToMultiByte
            (1252, 0, wideString.c_bstr(), -1, NULL, 0, NULL, NULL);

        size--;

        if (size > 0)
        {
            buffer = new char[size];
            WideCharToMultiByte
                (1252, 0, wideString.c_bstr(), -1, buffer, size, NULL, NULL);
            fileStream = new TFileStream(fileName, fmCreate);
            fileStream->WriteBuffer(buffer, size);
        }
    }
    __finally
    {
        delete[] buffer;
        delete fileStream;
        delete memoryStream;
    }
}


С уважением, Андрей Терехин.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.