Форум программистов, компьютерный форум CyberForum.ru

Как вывести 1 букву из строки (cmd 65001) ? - C++

Восстановить пароль Регистрация
 
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 91
11.12.2014, 02:20     Как вывести 1 букву из строки (cmd 65001) ? #1
Дело в том что cout << str[0] при таком раскладе выбивает в ошибку.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
void main()
{
    // файл в кодировке 65001 - UTF-8 без BOM (without signature)
 
    system("chcp 65001");
    char str[] = "дюВ";
    // вывело 12 - по 3 байта на японский символ + 2 байта русс + 1 байт конечный
    cout << sizeof(str) << endl;
    printf(str);
    cout << endl;
 
    // как вывести 1 букву из строки ?
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2014, 02:20     Как вывести 1 букву из строки (cmd 65001) ?
Посмотрите здесь:

C++ Как вывести строки?
Вывести все слова из каждой строки, начинающиеся и заканчивающиеся на заданную букву и количество таких слов в каждой строке. C++
C++ Строки: вывести определенную букву или слово и их количество
Вывести все введенные строки. Отсортировать строки. Вывести самую длинную строку C++
Удалить букву из строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
11.12.2014, 08:56     Как вывести 1 букву из строки (cmd 65001) ? #2
Где японские символы? Я только три русских вижу.
utf8 нужно конвертировать в utf16, и тогда можно будет с отдельными символами работать.
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 91
11.12.2014, 15:51  [ТС]     Как вывести 1 букву из строки (cmd 65001) ? #3
Без конвертации, дополнительная библиотека для работы с начала до конца с utf-8 в консоли win cmd есть ли в природе ???
С единичным "объяснением всего" консоли и спокойной работой на ввод и вывод символов utf-8.
Без преобразований - это очень важно.
Допустим юниксовые консоли спокойно работают, в виндовой нужны "костыли".
Вообщем есть ли такое, чтобы объяснял-О ?
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
11.12.2014, 15:55     Как вывести 1 букву из строки (cmd 65001) ? #4
Я пробовал консоль Linux, там тоже к отдельному символу в строке utf8 не обратиться без конвертации. Я чего-то не знаю?
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 91
11.12.2014, 16:13  [ТС]     Как вывести 1 букву из строки (cmd 65001) ? #5
Получается по стандарту мы "обязаны" хранить исходники в UTF-8 без BOM.
А когда встречаемся с консолями постоянно долго / усердно / мучительно объясняем как прочитать этот символ.
Потому что видите ли я читаю именно так символы в моей "родной" кодировке.
Ааааааааааррррррр..... Борьба продолжается...

Добавлено через 3 минуты
Да libiconv решает спектр задач с перекодированием "на лету", но готовы ли мы платить эту ЦЕНУ.
Почему нельзя единожды сказать кодировка консоли UTF-8, программа скомпилирована с UTF-8 исходников.
Все хорошо работайте спокойно дальше.

А потому что когда то давным давно все скрестили и порядок байтов и кодировки и размеры.
И эти понятие НЕ ОТДЕЛИЛИ чтобы им "хорошо" там было.
То есть надо разделять входной поток байтов(битов) и по какой кодировке их читать (но все в куче и приняв новые стандарты С++ бы завалил огромное количество кода по всему миру, но блин.... мда...)
Отсюда и вся свестопляска, что одни говорят так, другие иначе, третьи НЕ понимают и НЕ поддерживают.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
11.12.2014, 16:24     Как вывести 1 букву из строки (cmd 65001) ? #6
Я не пойму, чего ты хочешь? Работать с utf8 как с обычной строкой применяя индексацию []?
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 91
11.12.2014, 16:30  [ТС]     Как вывести 1 букву из строки (cmd 65001) ? #7
Я хочу cin >> cout << с полной поддержкой utf-8 либо альтернатива стандартым потокам.
Спрашиваю есть ли в природе библиотека подобная ?
И да ты прав мне нужен доступ к выборочным буквам также.
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
11.12.2014, 20:24     Как вывести 1 букву из строки (cmd 65001) ? #8
Цитата Сообщение от Redee Посмотреть сообщение
Отсюда и вся свестопляска, что одни говорят так, другие иначе, третьи НЕ понимают и НЕ поддерживают.
Свистопляска потому, что нужно работать в нативной кодировке ОС. У стандартной консоли в силу исторических причин есть определенные проблемы, но ты решил еще больше себе жизнь усложнить и добавил к ним проблемы с UTF8 В Windows нативная кодировка - это UTF16\UCS-2. В Linux - UTF-8. Пытаешься затащить чуждую UTF8 в Windows - получаешь проблемы. Перекодировка все равно будет (UTF8 -> UTF16 и наоборот), но где-то внутри. Нужен юникод в Windows - используй UTF-16, нужна работа без каких-либо перекодировок, опять же, используй UTF-16.
Вложения
Тип файла: zip demo.zip (1.5 Кб, 10 просмотров)
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
11.12.2014, 20:40     Как вывести 1 букву из строки (cmd 65001) ? #9
printf() нормально выводит utf8, а вот cout - нет.
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
11.12.2014, 21:13     Как вывести 1 букву из строки (cmd 65001) ? #10
nmcf, если так хочется UTF8 в std::cout, то нужно просто написать\найти facet, который знает как работать с utf-8 и заменить им стандартный в std::cin/std::cout (метод imbue).
Либо написать наследника от std::basic_streambuf с учетом специфики UTF-8.

Только вот автор выше просил вообще без перекодировок. А этого можно добиться только используя нативную кодировку ОС.

Добавлено через 16 минут
Цитата Сообщение от Redee Посмотреть сообщение
Спрашиваю есть ли в природе библиотека подобная ?
Ну или можно посмотреть здесь. Строковые типы там собственные. В том числе есть перегрузки для std::cout/std::cin. Перекодировка вся будет внутри библиотеки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2014, 21:48     Как вывести 1 букву из строки (cmd 65001) ?
Еще ссылки по теме:

Строки. Дано предложение. Заменить в нем букву a на букву z C++
C++ Как, создав переменную класса string, вывести ее последнюю букву на экран
Вывести строки, где есть слова, начинающиеся на букву а C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
11.12.2014, 21:48     Как вывести 1 букву из строки (cmd 65001) ? #11
Цитата Сообщение от DrOffset Посмотреть сообщение
если так хочется UTF8 в std::cout, то нужно просто написать\найти facet
codecvt нормально работает с файлом utf8, с cout так не получается.
Yandex
Объявления
11.12.2014, 21:48     Как вывести 1 букву из строки (cmd 65001) ?
Ответ Создать тему
Опции темы

Текущее время: 14:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru