Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::cout и перекодировка на лету / 7 сообщений из 7, страница 1 из 1
04.09.2005, 11:32
    #33250229
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::cout и перекодировка на лету
Предположим есть класс Encoder который может преобразовывать строки напримет из cp1251 в UTF-8.

хочется чтобы при написании конструкции std::cout<<"привет!"; автоматически выполнялось преобразование... Насколько я понимаю решение должно быть примерно таким

std::ostream& operator << (std::ostream& s, char* value)
{
TEncoder Encoder("cp1251","UTF-8");
return s<<Encoder.Convert(value);
};

int main(void){
std::cout<<"привет!";
};

Но что-то не получается... Вызывается все равно стандартный оператор <<
...
Рейтинг: 0 / 0
04.09.2005, 12:35
    #33250272
Radjaman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::cout и перекодировка на лету
скорее д.б. что-то подобное:

class Encoder
{
protected:
char * Convert(char *from, char *to, char *qqq)
{ ... }
public:
ostream& operator << (char *value)
{
return cout << this->Convert("KOI-8", "1251", value);
}
};

void main()
{
Encoder qq;
qq<<"привет земляк";
}
...
Рейтинг: 0 / 0
05.09.2005, 05:46
    #33250599
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::cout и перекодировка на лету
Думаю такое решение не подойдет - написана достаточно большая программа и возникла необходимость работы с несколькими кодировками без модификации всех исходников. Результат требуется путем переопределения оператора <<.
...
Рейтинг: 0 / 0
05.09.2005, 10:21
    #33250876
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::cout и перекодировка на лету
ChameLe0n
std::ostream& operator << (std::ostream& s, char* value)
{
TEncoder Encoder("cp1251","UTF-8");
return s<<Encoder.Convert(value);
};

Но что-то не получается... Вызывается все равно стандартный оператор <<
Все хорошо и красиво, но у тебя нет перегрузки (overloading) стандартного метода.
Вернее ты его переписал , но (видимо) линкер взял все равно стандартный или еще по каким-то причинам. Тебе нужно другой тип потока создать и делать overloading. Или унаследоваться от стандартного потока и переопределить метод вывода буфера строки в файл (или куда там), что вообще будет еще и легче, ибо только один метод нужно будет переписать. Правда я не знаю, возможно ли это.
...
Рейтинг: 0 / 0
05.09.2005, 11:03
    #33251003
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::cout и перекодировка на лету
замените cout на свой поток, в котором предусмотрите возможность изменения кодировки
...
Рейтинг: 0 / 0
05.09.2005, 19:36
    #33252648
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::cout и перекодировка на лету
заменил это:
int main(void){
std::cout<<"привет!";
};
на это
int main(void){
char str[]="привет!"
std::cout<<str;
};

Начал вызываться мой оператор << , притом рекурсивно... :(
...
Рейтинг: 0 / 0
07.09.2005, 16:12
    #33256863
Homosum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::cout и перекодировка на лету
А как же реализовать поддержку Юникода. Вообще расскажите кто как реализует поддержку Юникода.
Заранее спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::cout и перекодировка на лету / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]