Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 31.08.2021
Сообщений: 30

Странности с юникодом

17.04.2023, 10:41. Показов 1144. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Решил научиться писать C++-программы под кодировку Unicode и, так сказать, еще на берегу, столкнулся с хоть и незначительной, но все-таки странностью: Unicode в консоли устанавливается только при смене языкового стандарта времени выполнения функцией setlocale(LC_ALL, ""). Что же тут странного, спросите Вы? А то, что функция возвращает строку Russian_Russia.1251.

Вопрос: ГДЕ ТУТ, %?!№*, UNICODE!? 1251 - кодировка ASCII, а не Unicode. В ней все коды меньше 256, а на скриншоте вывода во вложении код буквы 'Ю' равен 1070 (и консоль успешно эту букву вместе с остальным русским текстом выводит). Отсюда вывод: несмотря на возврат функцией setlocale строки Russian_Russia.1251, кодировка консоли устанавливается в нужную нам - UTF-8.

Еще из "интересного" - вызовы setlocale(LC_ALL, ".UTF8") и setlocale(LC_ALL, "Russian_Russia.UTF8") к установке кодировки консоли в Unicode НЕ ПРИВОДИТ! Т. е. setlocale(LC_ALL, "") приводит, а setlocale(LC_ALL, ".UTF8") не приводит - прекрасно, правда? Еще, кстати, вывод Russian_Russia.1251 (и, соответственно, смена на UTF-8) получается из вызовов setlocale(LC_ALL, "Russian") и setlocale(LC_ALL, ".1251"). Т. е. setlocale(LC_ALL, "") = setlocale(LC_ALL, "Russian") = setlocale(LC_ALL, ".1251") --> смена на UTF-8, но вывод Russian_Russia.1251, а setlocale(LC_ALL, ".UTF8") --> вообще ?*!№% не происходит.

Прочие способы смены кодировок (SetConsoleOutputCP(CP_UTF8) + SetConsoleCP(CP_UTF8) и system("chcp 65001")) вообще никак не работают.

P. S. Если запускать экзешник проги из CMD, юникод также устанавливается, но почему-то консоль может выводить только один русский символ (т. е. слово вывести не получится - вывод 1-ой буквы и до свидания).

Есть у кого-нибудь какие-нибудь мысли по поводу этого бреда? Всем заранее спасибо.

Листинг:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstring>
#include <windows.h>
 
using namespace std;
 
int main() {
    //system("chcp 65001"); Не работает
    //SetConsoleOutputCP(CP_UTF8); Не работает
        //SetConsoleCP(CP_UTF8); Не работает
    wchar_t* myLocale = _wsetlocale(LC_ALL, L"");
    wchar_t wStr[17] = L"Unicode! Юникод!";
    wcout << wStr[9] << L" в юникоде равно:";
    wcout.clear();
    wcout << L" " << (int) wStr[9] << L" " << myLocale << L" " << wStr << L" " << wcslen(wStr) << L" " << strlen((char*) &wStr[9]) << endl;
    getch();
    return 0;
}
Миниатюры
Странности с юникодом   Странности с юникодом  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2023, 10:41
Ответы с готовыми решениями:

Разобраться с Юникодом
Помогите написать программу, которая будет корректно отображать русские символы. не понимаю как использовать Юникод. Пытаюсь...

Разобраться с Юникодом
Помогите написать программу, которая будет корректно отображать русские символы. не понимаю как использовать Юникод. Пытаюсь...

Работа с юникодом
Добрый день. Подскажите пожалуйста. Мне надо заполнить знаковый массив знаками, не считая английского и русского лафавита, только знаками....

2
0 / 0 / 1
Регистрация: 31.08.2021
Сообщений: 30
17.04.2023, 11:43  [ТС]
UPD: Оказывается консоль каким-то чудом может корректно выводить кириллицу одновременно в кодировках и ANSI и UTF-8. Т. е. после вызова setlocale(LC_ALL, "") можно спокойно сделать так:

cout << (char) 222;
wcout << (wchar_t) 1070;

И в консоли напечатаются две буквы 'Ю'. Вынос мозга.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.04.2023, 20:51
One290, о кодировках консоли windows
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2023, 20:51
Помогаю со студенческими работами здесь

Разобраться с Юникодом
Моя программа: class Unicode { public static void main (String args) { System.out.println('\u0108'); } }

Вывод с базы с юникодом
Здравствуйте. Вывожу с базы данных, Bié выводит как é, í выводит как í Кодировка стоит UTF-8, колонка имеет кодировку utf-8...

Вывод с базы с юникодом
Здравствуйте. Вывожу с базы данных, Bié выводит как é, í выводит как í Кодировка стоит UTF-8, колонка имеет кодировку utf-8...

Workbench отказывается работать с юникодом
Создаешь базу, указываешь кодировку UTF-8, а редактор запросов знай себе в однобайтной кодировке русский текст заносит. Даже непонятно в...

Конвертирование с юникодом, не могу запустить
Программа не комплируеться, кричит на последнюю скобку: Unit1.cpp(347): E2034 Cannot convert 'UnicodeString' to 'const char *' ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru