
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.173] |
![]() |
|
Сообщ.
#1
,
|
|
|
Чаще всего причина в том, что кодировка консоли и кодировка выводимой строки не совпадают (CP 866, также известная как DOS, для консоли и Windows-1251 для файла). Самое простое решение - записать файл в кодировке CP 866. В среде Visual Studio это делается с помощью опции меню "File -> Advanced Save Options...".
|
![]() |
Сообщ.
#2
,
|
|
вариант программно с использованием средств языка
![]() ![]() #include <string> #include <iostream> std::string rus(std::string strIn) { std::string strOut=strIn; for(std::string::size_type i=0;i<strOut.length();++i) { if(strOut[i]>='А'&& strOut[i]<='п' ) strOut[i]-=64; if(strOut[i]>='р'&& strOut[i]<='я' ) strOut[i]-=16; } return strOut; } int main() { std::cout<<rus("Текст")<<std::endl; } ещё вариант с использованием WinApi ![]() ![]() LPCSTR Rus(LPCTSTR pszIn) { static char szBuffer[MAX_PATH]; CharToOemBuff(pszIn, szBuffer, MAX_PATH); return szBuffer; } |
Сообщ.
#3
,
|
|
|
![]() ![]() #include <iostream> #include <locale> #include <cstdio> int main() { setlocale(LC_ALL, "russian_russia.1251"); std::cout << "Тест" << std::endl; std::wcout << L"Тест юникода" << std::endl; printf("Тест C\n"); return 0; } |
Сообщ.
#4
,
|
|
|
n0rd, а разве работает в ОСях ниже ХП?
|
Сообщ.
#5
,
|
|
|
Цитата barazuk @ n0rd, а разве работает в ОСях ниже ХП? почему не должно работать? Может разве что в 98-й работать не будет, т.к. там поддержки Юникода еще не было |
Сообщ.
#6
,
|
|
|
Можно кодировку консоли изменить:
![]() ![]() #include <iostream> #include <windows.h> int main() { SetConsoleOutputCP(1251); //That's all return 0; } |
![]() |
Сообщ.
#7
,
|
|
Тут видимо имелось в виду то, что поддержка локалей в C++ опирается на ОС API, а в ОСах до XPёвых времён возможна недостача кодовых страниц. Естественно, что C++ тут будет бессилен.
P.S. Впрочем, и сугубо Cшная setlocale() в некоторых реализациях может быть подвержена определённым ограничениям RTL. Например, при использовании STLPort совместно с VC она ведёт себя не так, как оригинальная MSная setlocale(). |
Сообщ.
#8
,
|
|
|
Цитата barazuk @ n0rd, а разве работает в ОСях ниже ХП? А надо? ![]() Цитата miksayer @ Может разве что в 98-й работать не будет, т.к. там поддержки Юникода еще не было В 95 (не OSR 2), с этим было туго, в 98 должно быть нормально, хотя я не проверял. |
Сообщ.
#9
,
|
|
|
А у меня не получаеться уговорить мою хрюшу на utf-16
Вот прямо в консольке вбиваю и получаю Цитата C:\>chcp 1200 Указана недопустимая кодовая страница C:\>chcp 65001 Текущая кодовая страница: 65001 Как видите, utf-8 скушал. А на utf-16 материться. коды смотрел здесь |
Сообщ.
#10
,
|
|
|
Варианты
Цитата n0rd @ ![]() ![]() #include <iostream> #include <locale> #include <cstdio> int main() { setlocale(LC_ALL, "russian_russia.1251"); std::cout << "Тест" << std::endl; std::wcout << L"Тест юникода" << std::endl; printf("Тест C\n"); return 0; } и Цитата Dimka_PREsideNT @ В C++Builder 6 не работают. ![]() ![]() SetConsoleOutputCP(1251); |
Сообщ.
#11
,
|
|
|
Кстати, ни один из вышеприведенных вариантов с установками локали у меня в Code::Blocks Так и не заработал. Зато функция rus, изменяющая код символа с win1251 на внутренню code::blocks работает прекрасно.
|
Сообщ.
#12
,
|
|
|
Функция rus (в подавляющем большинстве своих вариантов) как правило перестает работать, как только сталкивается с нетривиальными случаями.
Внутренняя Code::Blocks как правило совпадает с системной, то есть windows-1251. Что заметил, в куче кодировок, которые знает Code::Blocks, нет ни одной OEM (8xx). |