кириллица в консольной программе

Тема в разделе "Общие вопросы по С и С++", создана пользователем Seva, 7 май 2007.

Статус темы:
Закрыта.
  1. Seva

    Seva Гость

    Репутация:
    0
    Сделал программу, такую, как хотел, но возникла проблема... изучаю программирование недавно, потому не думал, что такая проблема возникнет. короче, программа: у пользователя в буфере обмена несколько слов, например, (дворец король королева), при открытии программы, слова обрабатываются специальным образом и у пользователя в буфере обмена оказывается что-то типа (король дворец королева). если изначально слова написаны латиницей, то всё отлично, а вот если кириллицей- то в результате получаются одни ???? в буфере обмена... догадываюсь, что это обычное дело, но неужели нельзя никак решить эту проблему, кроме как изменения кодировки на компьютере? хотелось бы, чтобы эта программа работала на любом другом компьютере, кроме моего, тоже. наверное, можно решить эту проблему, написав приложение win32, но я пока не умею, т. ч. хотелось бы доработать этот вариант! может, можно что-то забить в программу? спасибо всем за ответы!
     
  2. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
  3. Seva

    Seva Гость

    Репутация:
    0
    спасибо, поиском научился пользоваться раньше, чем программировать! читал я эти посты, но мне не подходит- как быть, если слова изначально будут на разных языках, т. е. некоторые кириллицей, а некоторые- латиницей? разве вот только CharToOem попробовать, но, как начинающий, я не умею, на мастдае сложно разобраться, ибо в английском не силён! не могли бы Вы описать правила использования этой функции? спасибо!
     
  4. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
    <!--QuoteBegin-Seva+7:05:2007, 17:17 -->
    <span class="vbquote">(Seva @ 7:05:2007, 17:17 )</span><!--QuoteEBegin-->если слова изначально будут на разных языках, т. е. некоторые кириллицей, а некоторые- латиницей?
    [snapback]65095" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    В таких случаях мой препод по программированию говорил: "Вот вам компутер, бери и пробуй...". Вот и у меня к тебе такой же вопрос: а ты пытался выводит такие предложения после конвертирования с помощью CharToOem? Каков результат?
     
  5. Seva

    Seva Гость

    Репутация:
    0
    :) :) пробовал... вот уже несколько дней бьюсь, НО! в программе кирилическое слово поступает из буфера обмена, т. е. тип строковый, string, а CharToOem обрабатывает только тип char, как я понимаю, ибо ни в какую не хочет работать со строковым параметром. ещё предложения?
     
  6. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
    <!--QuoteBegin-Seva+15:05:2007, 11:22 -->
    <span class="vbquote">(Seva @ 15:05:2007, 11:22 )</span><!--QuoteEBegin-->т. е. тип строковый, string,
    [snapback]65990" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Я так понимаю, что std::string? Тогда string.c_str() вернет char*
     
  7. Seva

    Seva Гость

    Репутация:
    0
    это вот так:
    #include<iostream>
    #include<string>
    using namespace std;
    int main(void)
    {
    string name="проблема";
    char bulb=name.c_str();
    cout<<"1: "<<name
    <<"\n2: "<<bulb<<endl;
    return 0;
    }
    ?
    не работает! пишет 1 ошибка:
    (7) error C2440: 'initializing' : cannot convert from 'const char *' to 'char'
    так как же можно преобразовать string в char? например, с помощью atof() можно сделать такое преобразование, не пробовали? а если можно, то как?
     
  8. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
    Если очень хочется, то можно сделать следующим образом, однако такая строка - потенциальный источник ошибок на этапе выполнения:
    Код (Text):
    const char* bulb = name.c_str();
    Лучше сделать вот так:
    Код (Text):
        cout<<"1: "<< name
    <<"\n2: "<< name.c_str() <<endl;
     
  9. Seva

    Seva Гость

    Репутация:
    0
    спасибо, конечно, первый вариант лучше подходит, НО, опять проблема, опять преобразование... теперь бы этот char* bulb преобразовать в char c_bulb, чтобы его потом функцией CarToOem обработать, а с char* она не хочет работать! ;) не знаете как это решить?
     
  10. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
    Уважаемый, а вы в MSDN хоть заглядывали?
    Преобразуй char* в LPCTSTR или LPSTR в зависимости от параметра
     
  11. Seva

    Seva Гость

    Репутация:
    0
    Да заглядывал, заглядывал, даже больше- старался внимательно изучать... но вот что у меня получается:
    #include<iostream>
    #include <windows.h>
    #include<string>
    using namespace std;
    int main(void)
    {
    char bulb2;
    string name="проблема";
    const char* bulb = name.c_str();
    CharToOem(bulb2,bulb);


    cout<<"1: "<<name
    <<"\n2: "<<bulb2<<endl;
    return 0;
    }
    по задумке на экране в строчке 2 должно быть слово "проблема" (bulb2), но компилятор упорно выдаёт ошибку:

    (10) : error C2664: 'CharToOemA' : cannot convert parameter 1 from 'char' to 'const char *'

    это опять я что-то не так сделал? а что? вроде, всё, как в мастдае написано...
     
  12. GRLEX

    GRLEX Гость

    Репутация:
    0
    Попробуй поставить амперсанд.
    <!--QuoteBegin-Seva+15:05:2007, 17:57 -->
    <span class="vbquote">(Seva @ 15:05:2007, 17:57 )</span><!--QuoteEBegin-->CharToOem(bulb2,bulb);
    [snapback]66053" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    в этой фразе перед blub2
    ;)
     
  13. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
    О-о, какой-то мастдай у тебя неправильный, если ты параметры местами перепутал... А я то думаю, чего CharToOem с char* не хочет работать...
    Код (Text):
    int main(void)
    {
    char bulb2[20];
    string name = "проблема";
    CharToOem( name.c_str(), bulb2 );

    cout << "1: " << name << endl;
    cout << "2: " << bulb2 << endl;
    return 0;
    }
    <!--QuoteBegin-GRLEX+15:05:2007, 18:18 -->
    <span class="vbquote">(GRLEX @ 15:05:2007, 18:18 )</span><!--QuoteEBegin-->Попробуй поставить амперсанд.
    [snapback]66060" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    И по колесам постучи
     
  14. Seva

    Seva Гость

    Репутация:
    0
    О! то, что доктор прописал! СПАСИБО!
     
  15. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    1
    Жаль, что спасибо на хлеб не намажешь :)
     
  16. Seva

    Seva Гость

    Репутация:
    0
    ага, и в стакан налить тоже! :)
    работаем дальше... возникает опять проблема: из буфера обмена всё выводится на экран, но не всегда корректно, т. е. если в буфере ТОЛЬКО кирилические символы (Иван) или ТОЛЬКО латиница (Pupkin), то всё работает корректно, но стоит поработать с совмещённым буфером (Иван Pupkin), так сразу вместо кирилицы получаются ??? не подскажете в чём проблема? вот код:
    Код (Text):
    //из буфера обмена на экран
    #include<iostream>
    #include<string>
    #include <windows.h>
    #pragma comment(lib, "user32.lib")
    using namespace std;
    int main(void)
    {
    char bulb[20]; 
    string fromClipboard, name;
    OpenClipboard(0);
    {
    HANDLE hData=GetClipboardData(CF_TEXT);
    char* chBuffer=((char*)GlobalLock(hData));
    fromClipboard=chBuffer;
    CharToOem(fromClipboard.c_str(),bulb);
    GlobalUnlock(hData);
    CloseClipboard();

    }
    cout<<bulb<<endl;
    cin>>name;
    return 0;
    }
     
  17. Sailor

    Sailor Гость

    Репутация:
    0
    че вы тупите вот код
    #include <windows.h>
    char BufRus[255];
    char *Rus(char *str)
    {
    CharToOem(Str,BufRus);
    return BufRus;

    }
    int main()
    {
    cout<<Rus("Ни каких проблем с русским текстом");
    getch();
    return 0;
    }
     
Загрузка...
Похожие Темы - кириллица консольной программе
  1. R4z0R
    Ответов:
    4
    Просмотров:
    811
Статус темы:
Закрыта.

Поделиться этой страницей