Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вывод русских букв

29K
12 июня 2008 года
kermit
11 / / 16.01.2008
Создаю программу в ms vs, console aplication. И когда пытаюсь вывести русские буквы выходят каракули. Как сделать так что русские буквы корректно отображались?
19K
12 июня 2008 года
Mhael
54 / / 20.03.2008
Думаю, если бы ты погуглил, то нашел очень быстро. Почти каждый с этим сталкивался в свое время :)
http://msdn.microsoft.com/en-us/library/ms647473(VS.85).aspx кури это ну и что-то похожее.
26K
12 июня 2008 года
GoreNJ
33 / / 02.09.2007
Mhael, можешь по подробней? я как-то раньше обходился транслитом, а теперь заинтересовался. Не могу разобраться, как эту функцию корректно вызвать. Вот код:
Код:
#include "stdafx.h"
#include "conio.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
    char *str="Привет!";
    char *oemstr;
    ::CharToOem(str, oemstr);
    printf("%s",oemstr);
    getch();
    return 0;
}

что я неправильно сделал?
26K
12 июня 2008 года
GoreNJ
33 / / 02.09.2007
Ой, прошу прощения. На этом же форуме уже это обговаривалось.
В моём коде ошибка - обьявление второй переменной. Необходимо указать размер массива: char oemstr[100];
Вот ссылка на обсуждение этого вопроса:
http://forum.codenet.ru/showthread.php?t=36225
87
12 июня 2008 года
Kogrom
2.7K / / 02.02.2008
Эх, не очень удобная функция RussianMessage из FAQ, например в следующем случае:
cout << "на вашем счету" << x << "рублей" << endl;
кроме того, не люблю я строки в стиле c.
Придумал функцию, которая хоть и ходит на грани дозволенного, но вроде работает :)

[COLOR="Red"]ВНИМАНИЕ: далее следует ошибочный код, который исправлен в последующих сообщениях.[/COLOR]
 
Код:
string RussianMessage(string str)
{
   char message[str.size()];
   CharToOem(str.c_str(),message);
   return message;
}

cout << RussianMessage("на вашем счету") << x << RussianMessage("рублей") << endl;

хотя с юникодом наверно правильнее.
6.6K
13 июня 2008 года
Ordos
105 / / 02.11.2007
Для вывода русских букв:
1. Вставляем следующий инклуд:
 
Код:
#include <locale>

2. Единожды вызываем функцию:
 
Код:
setlocale(LC_ALL, ".866");

3. Далее ввод-вывод делаем через потоки wcout\wcin:
 
Код:
[FONT=Arial]wcout << L"Ой! Русские букаффки!";[/FONT]
int i;
wcin >> i;
wcout << i;


Вобщем wcout\wcin - полные аналоги потоков cout\cin только используют юникодные строки (Это те, что начинаются с "L", например L"Строка юникодная.")
И вообще для работы с юникодными строками есть много функций, они обычно начинаются с "w" или с "_w", это нужно смотреть, не помню.
1.6K
13 июня 2008 года
Vov4ick
476 / / 01.02.2007
Конвертирование строк во время работы программы вместо того чтобы сразу задать их в нужной кодировке по-моему забавно.
87
13 июня 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Vov4ick
Конвертирование строк во время работы программы вместо того чтобы сразу задать их в нужной кодировке по-моему забавно.


Оно может и забавно, но сразу писать в OEM-кодировке в файле с ANSI-кодировкой трудновато, а операции с юникодом мой компилятор вроде бы не поддерживает:

http://www.mingw.org/MinGWiki/index.php/wide%20characters

Да и использую я консоль редко и в основном для изучения чего-либо и для опытов. Так, что конвертирование строк во время работы программы меня устраивает.

41K
27 июня 2008 года
Bleeth
1 / / 27.06.2008
Цитата: Kogrom
...
Придумал функцию, которая хоть и ходит на грани дозволенного, но вроде работает :)
 
Код:
string RussianMessage(string str)
{
   char message[str.size()];
   CharToOem(str.c_str(),message);
   return message;
}


1>r:\программирование\test\main.cpp(8) : error C2057: expected constant expression
1>r:\программирование\test\main.cpp(8) : error C2466: cannot allocate an array of constant size 0
1>r:\программирование\test\main.cpp(8) : error C2133: 'message' : unknown size
Проблема решается, если объявить message динамически:

 
Код:
char* message = new char[str.length()];

Для вывода русских строк вообще вполне достаточно способа, который описал Ordos. Чтобы не заморачиваться с юникодными строками, можно написать так:
 
Код:
#include <locale>
...
setlocale(LC_ALL, "rus");

и далее можно пользоваться стандартным потоком вывода:
 
Код:
cout << "Ура, работает!";

Впрочем, следующий код:
 
Код:
std::string s;
std::cin >> s;
std::cout << s;

все равно перекосячит русские буквы в нечто неудобоваримое...
1.6K
28 июня 2008 года
Vov4ick
476 / / 01.02.2007
Зачем огород городить? Неужели в студийном редакторе не переключается кодировка?
87
29 июня 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Bleeth
1>r:\программирование\test\main.cpp(8) : error C2057: expected constant expression
1>r:\программирование\test\main.cpp(8) : error C2466: cannot allocate an array of constant size 0
1>r:\программирование\test\main.cpp(8) : error C2133: 'message' : unknown size
Проблема решается, если объявить message динамически:
 
Код:
char* message = new char[str.length()];



хмм, а MinGW спокойненько переварил это безобразие, хотя я и подозревал, что может не пройти. Ну тогда так:

 
Код:
string RussianMessage(const string &str)
{
    char *message = new char[str.size() + 1];
    CharToOem(str.c_str(),message);
    string buffer(message);
    delete [] message;
    return buffer;
}


string buffer может тут и не нужен, но я не разрешаю себе оставлять new без delete.

Да, по поводу setlocale(LC_ALL, "rus") и wcout: там не string надо использовать, а wstring.
87
29 июня 2008 года
Kogrom
2.7K / / 02.02.2008
да, проверил: в 6-й студии следующий код работает:

Код:
#include "windows.h"
#include <string>
#include <iostream>
#include <locale>

using namespace std;

int main()
{
   
    setlocale(LC_ALL, ".866");
    wstring str(L"Утро");
    wcout << L"Доброе " << str << endl;
    return 0;
}


MinGW на такой код ругается типа wcout не знает...
42K
08 августа 2008 года
DrGrechkin
1 / / 08.08.2008
 
Код:
string RussianMessage(const string &str)
{
    char *message = new char[str.size() + 1];
    CharToOem(str.c_str(),message);
    string buffer(message);
    delete [] message;
    return buffer;
}


string buffer может тут и не нужен, но я не разрешаю себе оставлять new без delete.

buffer тут очень даже нужен! и это единственно правильный пример с использованием CharToOem из всех приведенных, потому что он не портит память. Единственно чего не хватает это проверки на пустую строку. Гороздо быстрее проверить на empty чем вызывать кучу ничего не делающих системных вызовов (это будут как минимум 2 раза GetProcessHeap, 1 раз HeapAlloc, HeapFree, CharToOem)

за код подобный
 
Код:
string RussianMessage(string str)
{
   char message[str.size()];
   CharToOem(str.c_str(),message);
   return message;
}

или
 
Код:
string RussianMessage(string str)
{
   char message[100];
   CharToOem(str.c_str(),message);
   return message;
}

надо лишать права заниматься программированием на несколько лет.
87
08 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: DrGrechkin
Единственно чего не хватает это проверки на пустую строку. Гороздо быстрее проверить на empty чем вызывать кучу ничего не делающих системных вызовов (это будут как минимум 2 раза GetProcessHeap, 1 раз HeapAlloc, HeapFree, CharToOem)


Зачем? Не думаю, что здесь нужна эта перестраховка - по смыслу функция не предназначена для работы с пустыми строками. Если есть вероятность вывода пустой строки, лучше проверку сделать за пределами функции.

Цитата: DrGrechkin

за код подобный
 
Код:
string RussianMessage(string str)
{
   char message[str.size()];
   CharToOem(str.c_str(),message);
   return message;
}

...
надо лишать права заниматься программированием на несколько лет.


"Только тот не делает ошибок, кто ничего не делает".
Однако, предупреждение об ошибочности кода надо внести, чтоб людей не смущать... Тут я промахнулся.

41K
14 августа 2008 года
zindi
2 / / 11.08.2008
дамс люди извращаютса
лутше всего будит
Цитата:
#include <windows.h>
main()
{
SetConsoleOutputCP(1251);
cout<<"Привет Миру..."<<endl;
}

87
15 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: zindi
дамс люди извращаютса...


Вот ведь неугомонные люди - каждый пытается показать, что самый умный, а остальные извращенцы ))))

Вот вам ссылка:

http://ovalsoft.nm.ru/Articles/Articles6.htm

там приведена куча методов, как выводить текст в консоль по русски. Про ваш метод там написано:

Цитата:
И сейчас вам совсем всю мазу испорчу: как показывает практика, SetConsoleCP и SetConsoleOutputCP даже на перечисленных в требованиях системах работают не всегда, если не сказать редко. Лично я пробовал их использовать на 4 машинах: две из них под Windows 2000 и две под Windows XP. И из этих 4 машин наши функции работали только на 1 (под Windows XP) - у меня дома :-)

Так что, метод, конечно, очень удобный, но ни хрена толком не работающий. А жаль…


И действительно - у меня не работает этот метод.

341
15 августа 2008 года
Der Meister
874 / / 21.12.2007
[QUOTE=Kogrom]Вот вам ссылка:

http://ovalsoft.nm.ru/Articles/Articles6.htm

там приведена куча методов, как выводить текст в консоль по русски.[/QUOTE]Из всех методов самый путёвый - последний. Решение всяческих проблем с кодировками было придумано ещё хрен знает когда, и имя ему - Unicode. Уже и в дветыщипятой студии эта кодировка по умолчанию стоит, и в .NET (привожу как пример новых технологий) все строки юникодовые, и даже в мобильных телефонах уже давно используют шестнадцатибную кодировку (забавно в файл-менеджере наблюдать арабские каракули в именах арабских же файлов), а прогресс в массы всё не идёт: все как один продолжают использовать однобайты.
87
15 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Der Meister
...а прогресс в массы всё не идёт: все как один продолжают использовать однобайты.


Не знаю кто как, но я как-то решил избавиться от пиратского софта. Денег у меня хватит только на Windows и антивирус, поэтому все остальное я заменил на свободно распостраняемое программное обеспечение (неразрешимой проблемой осталось пока только замена англо-русского словаря).

К чему это я? А к тому, что у MinGW этот Unicode - слабое место, не желает с ним работать (об этом я писал выше). Можно, конечно, перейти на бесплатную студию - вроде бы на ней все мои приложения компилируются (с небольшими поправками). Думаю об этом, но пока не собрал нужно количество за и против :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог