Feb 14, 2008 22:14
Думаю, не только мне одному переход на юникод дается так тяжело. Иначе бы небыло столько информации на форумах и в блогах.
На дворе XXI век, воспетый фантастами, а многие молодые порграммисты еще и не знаю, что такое юникод, не понимают зачем он нужен или просто не хотят менять привычную обстановку. Конечно, хорошо было жить на заре развития компьютерной техники, писать программы на ассемблере (а то и в кодах) и не думать о том, что текстовый символ может занимать более 7 бит. Вот только пользователи никак этого не хотят. Им подавай не только русские символы, но и китайские иероглифы. Так что надо рушить старую аксиому о том, что 1 символ - это 1 байт. Все. Этого больше нет. Кто этого не признает - или тупой, или реликт. Нужно забыть про CP1251, KOI8-R и (о боже, какая древность!) CP866. Но это все лирика. А есть еще и суровая реальность.
Юникод - это собирательное понятие. Есть множество кодировок, которые попадают под него. Самая известная, наверное, UTF-8. Это многобайтовая кодировка, однако, она имеет обратную совместимость с ASCII. Таким образом, чисто английский текст в этой кодировке не отличим от такого-же текста в 1985 году. А вот кириллические (и другие) символы в нем занимают более одного байта. Класс std::string работает одинаково хорошо и с обычными строками, и с юникодом. И стандартные потоки с успехом выводят этот текст. Если в системе правильно настроена локаль, и если в программе установлена правильная локаль, никаких проблем с выводом текста нет. За одним исключением. В строке "Привет, Мир!" не 12 символов, а 21. Вот такая лажа. Чтобы избежать такой "накрутки" необходимо использовать класс std::wstream, который работает с потоками std::wcin, std::wcout, std::wcerr, std::wifstream и прочими. Он так-же замечательно выводит этот текст, как и std::string, с тем лишь исключением, что теперь длина строки правильная: 12 символов.
В остальном, этот класс полностью подобен std::string (а иначе и быть не могло - это тот-же std::base_string, только на базе wchar_t).
Почему я это написал? До меня очень долго доходила эта простая мысль. Возможно, кому-то это поможет...
cpp,
string,
unicode,
iostream