1

Тема: setlocale (LC_CTYPE, "ukr");

Давно замітив, але якось не дуже переймався.

Чому літера і не підтримується?

P.S. Ще замітив, що у деяких інших мовах теж є такий баг )
І тому мені здається що тут щось пов'язано з різними кодуваннями.

Можете пояснити?

2

Re: setlocale (LC_CTYPE, "ukr");

В Сімці нема того глюку в консолі

3

Re: setlocale (LC_CTYPE, "ukr");

Я використовую Visual studio 2013 pro і windows 7 pro

#include <iostream>
using namespace std;

int main()
{
    setlocale(LC_CTYPE, "ukr");

    cout << "Привііт світ" << endl;

    system("pause");
    return 0;
}

Так от літера і у мене також відображається як '?'
Єдиний спосіб який я придумав це писати англійську літеру i . Але почало набридати кожен раз міняти мову.

4

Re: setlocale (LC_CTYPE, "ukr");

Joker написав:

Я використовую Visual studio 2013 pro і windows 7 pro

#include <iostream>
using namespace std;

int main()
{
    setlocale(LC_CTYPE, "ukr");

    cout << "Привііт світ" << endl;

    system("pause");
    return 0;
}

Так от літера і у мене також відображається як '?'
Єдиний спосіб який я придумав це писати англійську літеру i . Але почало набридати кожен раз міняти мову.

Можливо вам моя рекомендація не допоможе але все таки, я просто пишу setlocale(LC_CTYPE, "");
а потім Ctrl+H і замінюю "і" українське на "і" англійське

5

Re: setlocale (LC_CTYPE, "ukr");

Справа не в setlocale. Зайдіть в командний рядок (cmd в пошуку) і спробуйте написати "і" - отримаєте ваші "?".

Прихований текст

Йшов 2014 рік...

Подякували: Chemist-i1

6 Востаннє редагувалося Joker (10.11.2014 19:07:37)

Re: setlocale (LC_CTYPE, "ukr");

Йшов 2014 рік...

Прихований текст

Ну так у мене закінчувався тільки 15 рік життя

У cmd також '?'
Чому так ви вже поясните

7

Re: setlocale (LC_CTYPE, "ukr");

Joker написав:

Йшов 2014 рік...

Прихований текст

Ну так у мене закінчувався тільки 15 рік життя

У cmd також '?'
Чому так ви вже поясните

Тому що в консолі використовується ось це убожество. І якщо відсутність «ґ» ще можна пояснити політичними мотивами, то відсутність «і» при наявності «є» та «ї» пояснити досить складно. І навіть в 2014 році це не виправлено.

Подякували: koala, Joker, ostap34PHP, leofun014

8

Re: setlocale (LC_CTYPE, "ukr");

Чому ж Microsoft не виправлять цей баг?

хіба важко зробити щось нормальніше, більш схоже до терміналу.

9

Re: setlocale (LC_CTYPE, "ukr");

Joker написав:

Чому ж Microsoft не виправлять цей баг?

хіба важко зробити щось нормальніше, більш схоже до терміналу.

http://uk.wikipedia.org/wiki/Windows_PowerShell

Подякували: Joker, ostap34PHP, leofun013

10

Re: setlocale (LC_CTYPE, "ukr");

Можна так)

#define і i
Подякували: Joker, leofun012

11

Re: setlocale (LC_CTYPE, "ukr");

vl777v написав:

Можна так)

#define і i

Скрін вікна програми з прикладом результату в студію.

12

Re: setlocale (LC_CTYPE, "ukr");

quez написав:
Joker написав:

Йшов 2014 рік...

Прихований текст

Ну так у мене закінчувався тільки 15 рік життя

У cmd також '?'
Чому так ви вже поясните

Тому що в консолі використовується ось це убожество. І якщо відсутність «ґ» ще можна пояснити політичними мотивами, то відсутність «і» при наявності «є» та «ї» пояснити досить складно. І навіть в 2014 році це не виправлено.

Очевидно, вважається, що українці й білоруси можуть вводити латинську i замість кириличної (і якби цю багофічу перенесли в інші кодування й клавіатурні розкладки, ми б жили собі й горя не знали).
В принципі, крім cp866, існувало ще т.зв. RUSCII (воно ж cp1125 чи українське ГОСТ-кодування), близьке до нього, але розроблене незалежно — містить усі українські літери, хоч і кодує їх в іншому порядку, не має білоруської Ў, з Windows не постачається, в наш час не використовується, хоча мало деяку популярність у 90-х роках на довіндових системах.

Менш екзотичний варіант — увімкнути в консолі кодування cp1251 — на відміну від описаної вище екзоти, з кириличними кодами cp866 повністю несумісне, але це стандартне кириличне кодування для віконних програм.
Детальніше про це — в цій темі.

Подякували: leofun011

13 Востаннє редагувалося dbatsenko (15.10.2015 00:00:42)

Re: setlocale (LC_CTYPE, "ukr");

Привіт всім!

Якщо не знаєте як написати, то не треба когось звинувачувати - Майкрософт чи юнікод.
Ось 100% правильно працюючий код (Visual Studio 2013 Community Edition, Windows 7 English (налаштування: ukrainian for non unicode programs, шрифт lucida console):

#include<iostream>;
#include <locale>;
#include "windows.h";
 
using namespace std;
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Привіт, ґудзик!" << endl;
    //std::wcout << "Привіт, ґудзик!" << std::endl; //теж працює корректно
    system("pause");
 
}

https://replace.org.ua/misc.php?action=pun_attachment&amp;item=1026&amp;download=0

Post's attachments

ukr_console.JPG 28.65 kb, 296 downloads since 2015-10-14 

Подякували: #Sparta, DNS, Yola, pjotryk4

14

Re: setlocale (LC_CTYPE, "ukr");

dbatsenko написав:

Привіт всім!

Якщо не знаєте як написати, то не треба когось звинувачувати - Майкрософт чи юнікод.
Ось 100% правильно працюючий код (Visual Studio 2013 Community Edition, Windows 7 English (налаштування: ukrainian for non unicode programs, шрифт lucida console):

#include<iostream>;
#include <locale>;
#include "windows.h";
 
using namespace std;
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Привіт, ґудзик!" << endl;
    //std::wcout << "Привіт, ґудзик!" << std::endl; //теж працює корректно
    system("pause");
 
}

Можна я на тебе буду молитись??

Подякували: dbatsenko1

15

Re: setlocale (LC_CTYPE, "ukr");

pjotryk
Якщо ви хочете на когось помолитися, то моліться краще на Коалу за його статтю про кодування

Подякували: ostap34PHP, ReAl, leofun013

16 Востаннє редагувалося v.s.sahno (10.01.2019 20:49:51)

Re: setlocale (LC_CTYPE, "ukr");

dbatsenko написав:

Привіт всім!

Якщо не знаєте як написати, то не треба когось звинувачувати - Майкрософт чи юнікод.
Ось 100% правильно працюючий код (Visual Studio 2013 Community Edition, Windows 7 English (налаштування: ukrainian for non unicode programs, шрифт lucida console):

#include<iostream>;
#include <locale>;
#include "windows.h";
 
using namespace std;
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Привіт, ґудзик!" << endl;
    //std::wcout << "Привіт, ґудзик!" << std::endl; //теж працює корректно
    system("pause");
 
}

https://replace.org.ua/misc.php?action=pun_attachment&amp;item=1026&amp;download=0

У мене встановлена Вижуал Студио 17. Windows 7 Pro
Проблема та сама!
Якщо використовую

  setlocale(LC_ALL, "Ukrainian");

то виводить всі українські літери окрім "і"
Якщо ж пишу
     
     SetConsoleCP(1251);
     SetConsoleOutputCP(1251);

то взагалі увесь текст що виводиться на консоль перетворюється в аброкадабру:
причому стандартний текст теж.

#include <iostream>
#include <locale>;
#include "windows.h"
using namespace std;


int main(int argc, char** argv[])
{

//    setlocale(LC_ALL, "Ukrainian");
//    char* setlocale(int category, const char* locale); - Це я пробував пораду з іншого форуму
    SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода

    cout << "Привіт" << endl;
    
    return 0;
}

17 Востаннє редагувалося Kyryliuk (22.01.2019 15:26:42)

Re: setlocale (LC_CTYPE, "ukr");

v.s.sahno написав:
dbatsenko написав:

Привіт всім!

Якщо не знаєте як написати, то не треба когось звинувачувати - Майкрософт чи юнікод.
Ось 100% правильно працюючий код (Visual Studio 2013 Community Edition, Windows 7 English (налаштування: ukrainian for non unicode programs, шрифт lucida console):

#include<iostream>;
#include <locale>;
#include "windows.h";
 
using namespace std;
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Привіт, ґудзик!" << endl;
    //std::wcout << "Привіт, ґудзик!" << std::endl; //теж працює корректно
    system("pause");
 
}

https://replace.org.ua/misc.php?action=pun_attachment&amp;item=1026&amp;download=0

У мене встановлена Вижуал Студио 17. Windows 7 Pro
Проблема та сама!
Якщо використовую

  setlocale(LC_ALL, "Ukrainian");

то виводить всі українські літери окрім "і"
Якщо ж пишу
     
     SetConsoleCP(1251);
     SetConsoleOutputCP(1251);

то взагалі увесь текст що виводиться на консоль перетворюється в аброкадабру:
причому стандартний текст теж.

#include <iostream>
#include <locale>;
#include "windows.h"
using namespace std;


int main(int argc, char** argv[])
{

//    setlocale(LC_ALL, "Ukrainian");
//    char* setlocale(int category, const char* locale); - Це я пробував пораду з іншого форуму
    SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода

    cout << "Привіт" << endl;
    
    return 0;
}

При використанні:
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
У властивостях консолі замість "крапкові шрифти" виберіть інший шрифт, наприклад: Lucida Console або Consolas.

18

Re: setlocale (LC_CTYPE, "ukr");

А власне, в чому саме полігають відмінності в роботі коду з setlocale та без? По-моєму, там якийсь ефект спостерігається лише з «широкими символами» та рядками з них. Чи є випадки, коли звичайний однобайтний char* по-різному виводиться в залежності від локалі, заданої в setlocale?

19

Re: setlocale (LC_CTYPE, "ukr");

А якщо так(setlocale+SetConsole)?
Тому-що на деяких Visual Studio не допомагає зміна шрифта при SetConsoleCP(1251), SetConsoleOutputCP(1251), може якісь налаштування, або ще щось.

Прихований текст

#include <iostream>
#include <locale>;
#include "windows.h"
using namespace std;
void main()
{
    setlocale(LC_CTYPE, "ukr");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Привіт, ґудзик!" << endl;
}