Как выводить/вводить многобайтовые символы?

После долгих поисков я начал использовать этот странный код:

ofstream myfile;
    string chars =  "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    myfile.open ("alphabet.txt");
    for (int i = 0; i < 66; i+=2) {
        myfile << chars[i] <<chars[i+1] << "\n";
    }
    myfile.close();

Но неужели нет способа получить широкий символ из std::string?

std::string содержит chars, всегда содержал chars и всегда будет содержать chars. Для нелатинских символов одним из вариантов является использование региональных кодировок, таких как KOI8-R, однако использование KOI8-R и других наборов символов со временем устарело, а современные реализации C++ обычно по умолчанию используют многобайтовую кодировку UTF-8 для представления нелатинских символов. символов, где каждый символ, например "б", представлен многобайтовой последовательностью.
Sam Varshavchik 20.12.2020 16:59

Я знал об этом, но почему нет встроенного метода получения таких писем?!

Dmitry Sokolov 20.12.2020 17:01

В библиотеке C++ есть несколько классов для транскодирования между различными кодировками и Unicode, но они неудобны в использовании и не очень популярны. Большинство приложений, которые должны иметь дело с Unicode, будут использовать для этого одну из нескольких библиотек, например iconv.

Sam Varshavchik 20.12.2020 17:07

@DmitrySokolov Я думаю, потому что C++ предшествовал широкому распространению Unicode.

john 20.12.2020 17:14
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
4
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это сработало на моей машине. Мой файл исходного кода находится в UTF-8. Строка находится в UTF-16. Вывод в UTF-16LE.

Со временем C++ стал немного лучше обрабатывать строки Unicode, но все еще имеет много возможностей для улучшения.

#include <fstream>
#include <string>

using std::ofstream;
using std::string;

int main() {
    auto chars = u"абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    auto myfile = ofstream("alphabet.txt");
    for (char16_t const* p = chars; *p; ++p) {
        auto c = *p;
        auto cc = reinterpret_cast<char const*>(&c);
        myfile.write(cc, sizeof c);
    }
    myfile.close();
}

Другие вопросы по теме