|
|
|
std::cout и перекодировка на лету
|
|||
|---|---|---|---|
|
#18+
Предположим есть класс 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<<"привет!"; }; Но что-то не получается... Вызывается все равно стандартный оператор << ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2005, 11:32 |
|
||
|
std::cout и перекодировка на лету
|
|||
|---|---|---|---|
|
#18+
скорее д.б. что-то подобное: 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<<"привет земляк"; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2005, 12:35 |
|
||
|
std::cout и перекодировка на лету
|
|||
|---|---|---|---|
|
#18+
Думаю такое решение не подойдет - написана достаточно большая программа и возникла необходимость работы с несколькими кодировками без модификации всех исходников. Результат требуется путем переопределения оператора <<. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 05:46 |
|
||
|
std::cout и перекодировка на лету
|
|||
|---|---|---|---|
|
#18+
ChameLe0n std::ostream& operator << (std::ostream& s, char* value) { TEncoder Encoder("cp1251","UTF-8"); return s<<Encoder.Convert(value); }; Но что-то не получается... Вызывается все равно стандартный оператор << Все хорошо и красиво, но у тебя нет перегрузки (overloading) стандартного метода. Вернее ты его переписал , но (видимо) линкер взял все равно стандартный или еще по каким-то причинам. Тебе нужно другой тип потока создать и делать overloading. Или унаследоваться от стандартного потока и переопределить метод вывода буфера строки в файл (или куда там), что вообще будет еще и легче, ибо только один метод нужно будет переписать. Правда я не знаю, возможно ли это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 10:21 |
|
||
|
std::cout и перекодировка на лету
|
|||
|---|---|---|---|
|
#18+
замените cout на свой поток, в котором предусмотрите возможность изменения кодировки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 11:03 |
|
||
|
std::cout и перекодировка на лету
|
|||
|---|---|---|---|
|
#18+
заменил это: int main(void){ std::cout<<"привет!"; }; на это int main(void){ char str[]="привет!" std::cout<<str; }; Начал вызываться мой оператор << , притом рекурсивно... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 19:36 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33252648&tid=2032814]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 385ms |

| 0 / 0 |
