Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/114: Рейтинг темы: голосов - 114, средняя оценка - 4.89
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518

Преобразование String UTF8 в 1251

31.08.2014, 19:10. Показов 23067. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел пример:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
    wchar_t s[] = L"London Москва";
    char utf8[100];
    wchar_t wstr[100];
    char s1251[100];
    WideCharToMultiByte(CP_UTF8, 0, s, -1, utf8, 100, NULL, NULL);
    utf8[WideCharToMultiByte(CP_UTF8, 0, s, -1, utf8, 0, NULL, NULL)]='\0';
    // Подготовили строку UTF8 дальше идет ее преобразование в 1251
    MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, 100);
    wstr[MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, 0)];
    WideCharToMultiByte(1251, 0, wstr, -1, s1251, 100, NULL, NULL);
    utf8[WideCharToMultiByte(1251, 0, wstr, -1, s1251, 0, NULL, NULL)]='\0';
    printf("%s\n", s1251);
Шикарно работает в консоли, но ОЧЕНЬ надо пределать его в функции со String
C++ (Qt)
1
2
3
4
5
std::string UTF8_to_1251(const std::string ss) {
   //...
}
...
printf(UTF8_to_1251("London Москва"));
Но знаний по преобразованию строк в char и назад не хватает! Только начал вычитывать, а функция нужна срочно!
Помогите хоть немножко!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2014, 19:10
Ответы с готовыми решениями:

Setconsolecp 1251, setconsoleoutputcp 1251 (Windows.h), сбиваются шрифты на других ПК
Пишу консольную прогу с помощью vs 2017 (v141), на windows 10, с версией sdk 10.0.17134.0, MFC - в статической библиотеке, тестил прогу на...

{SetConsoleCP(1251); SetConsoleOutputCP(1251); сломал русс шрифт
получилось так что скомпилил и запустил программу со строкой {SetConsoleCP(1251); SetConsoleOutputCP(1251); теперь...

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

22
6 / 6 / 0
Регистрация: 14.10.2012
Сообщений: 36
31.08.2014, 20:09
Для перехода от string к const char* (неизменяемому массиву символов в куче) используйте метод c_str():
C++
1
const char* cLikeString = <объект типа string>.c_str();
Для создания строки типа string из массива символов просто вызовите конструктор.
C++
1
2
char* cLikeString = ...;
std::string cppLikeString(cLikeString );
Добавлено через 6 минут
p.s. Вы используете массивы символов на стеке (char arrayName[]). Вместо используемого выше варианта с указателями(char*) вполне можно использовать и их, синтаксис останется таким же. (вызов std::string(arrayName) эквивалентен std::string(&arrayName[0]), т.е. arrayName в данном случае приводится к char*)
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
31.08.2014, 21:04  [ТС]
Вторая часть кода подошла, но не первая. Она работает, но мне нужно другое:
std::string (или std::wstring) в wchar_t
0
6 / 6 / 0
Регистрация: 14.10.2012
Сообщений: 36
31.08.2014, 21:22
Аналогично
C++
1
2
std::wstring line(L"test string");
const wchar_t* szName = line.c_str();
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.08.2014, 21:49
Лучший ответ Сообщение было отмечено Tester64 как решение

Решение

Tester64, тут еще ведь нужно понимать, что L"строка" - это не UTF8. Это скорее UTF16 или USC2, если рассматривать windows.
Конвертирование же именно UTF8 в CP1251 под windows можно так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::string UTF8_to_CP1251(std::string const & utf8)
{
    if(!utf8.empty())
    {
        int wchlen = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), utf8.size(), NULL, 0);
        if(wchlen > 0 && wchlen != 0xFFFD)
        {
            std::vector<wchar_t> wbuf(wchlen);
            MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), utf8.size(), &wbuf[0], wchlen);
            std::vector<char> buf(wchlen);
            WideCharToMultiByte(1251, 0, &wbuf[0], wchlen, &buf[0], wchlen, 0, 0);
 
            return std::string(&buf[0], wchlen);
        }
    }
    return std::string();
}
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
31.08.2014, 22:25  [ТС]
ИДЕАЛЬНО!
Правда прилось еще добавить
C++ (Qt)
1
#include <vector>
(я как новичок этого не знал)
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
01.09.2014, 01:47
Хм, все бегут без оглядки от CP1251 и от всяких понаехавших "кодовых страниц", а тут наоборот, UTF-8 не нравится
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.09.2014, 01:50
Цитата Сообщение от gromo Посмотреть сообщение
Хм, все бегут без оглядки от CP1251, а тут наоборот, UTF-8 не нравится
Пусть сам налетает на все грабли
Всех все равно не переубедишь. Я тут сперва написал большой пост про пользу юникода и почему подстраиваться под устаревшую вин консоль (с дос кодировкой по умолчанию) не обязательно, но потом стер.
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2014, 03:48  [ТС]
Цитата Сообщение от gromo Посмотреть сообщение
Хм, все бегут без оглядки от CP1251 и от всяких понаехавших "кодовых страниц", а тут наоборот, UTF-8 не нравится
Цитата Сообщение от DrOffset Посмотреть сообщение
про пользу юникода и почему подстраиваться под устаревшую вин консоль (с дос кодировкой по умолчанию) не обязательно
Считайте капризом! Работаю под виндой. Пишу в блокноте (notepad++) без IDE. Компилирую батником. Код не большой. Самое главное - скорость сборки. А не удобство редактора и выпадающие подсказки. Результат вывожу в универсальную виндовую консоль. Как перепрошить всю винду с анси на юникод не знаю, да и не хочу - другие программы "крокозябры" писать будут (включая RAR и 7ZIP). Написал функцию - Rep("привет мир") - выводящую строку с результатом в консоль. В нее-же зашил анси. Все исходники (текстовики СРР и Н) храню в юникоде (где-то вычитал что это любимая кодировка g++ и NDK). Rep вызываю редко, но не хочу заморачиваться с перекодированием системной консоли на чужих машинах (или писать транслитом или вспоминать как это зовется на английском). Под линукс (если перейду) сделаю другой Rep. Под андроид третий (уже сделал). Команда одна, но сама решает что и как выводить. И главное без заморочек с кодировкой на входе. Смогу одной константой отключить перекодирование, но пока... Так удобнее! Да и учусь я пока. Простые утилитки пишу, базовые конструкции тестирую...

Пока-что перевод нужен был ТОЛЬКО для отладочных сообщений в консоль, хотя бывает необходимость и при работе с файлами кодировку заменить и со старым сервером через сеть пообщаться... Пусть себе лежит в коллекции. Заодно понял как строки конвертировать между разными типами (char-wchar-string), а это похоже крайне необохдимые знания в с++

p.s. Для ускорения вызова батников даже утилиту на делфи написал для вызова батников по горячим клавишам. И их принудильного перезапуска (перекомпиляция). ИМХО самое быстрое изученение... IDE много перепробовал - все тормозят сильно. Сборка пустышки под VC++ занимала минимум 20-30 секунд. Как и под DevCPP. Консоль (когда тормозит) за 7-8 секунд собирает, а если ускоряется около 3х секунд (почти догнал паскаль)...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.09.2014, 09:43
Цитата Сообщение от Tester64 Посмотреть сообщение
Как перепрошить всю винду с анси на юникод не знаю, да и не хочу - другие программы "крокозябры" писать будут (включая RAR и 7ZIP).
Не нужно ничего "перепрошивать", Windows уже лет 15 юникодная изнутри.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
01.09.2014, 09:54
Цитата Сообщение от DrOffset Посмотреть сообщение
Я тут сперва написал большой пост про пользу юникода и почему подстраиваться под устаревшую вин консоль (с дос кодировкой по умолчанию) не обязательно, но потом стер.
Ну и зачем стёр? Многим наверное было бы и полезно и интересно. Мне вот, например, интересно.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
01.09.2014, 10:28
Можно в вики почитать про юникод. Вообще, по нему полно ресурсов, например кратко и популярно: http://zelserg.livejournal.com/2570.html
1
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
01.09.2014, 18:06  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Windows уже лет 15 юникодная изнутри
Не знаю с какой стороны она изнутри юникоидная... Но консоль осталась в 1251. Вроде читал где-то что это можно поменять - то-ли подменой шрифтов, то-ли шаманством в реестре. Но все программы которые хотят вывести в консоль кирилицу используют 1251. Включая bat-файлы. Попробуйте в Win bat-файл в юникоде кирилицу вставить:
Bash
1
echo Привет
Не уверен что после хака консоли даже стандартные команды вроде dir кирилистические названия файлов правильно выводить будут (сейчас выводят)

А что такое юникод и чем он отличается от других кодировок, я думаю большинство и так знает. Но у него есть и свои минусы! По делфям помню (переводил проект с Delphi7 на Delphi2009) - каждый символ кодируется не одним байтом (как в других кодировках), от 2х до 4х!. Причем это плавающая величина и зависит от языка. И хранение в файлах и в памяти подобных строк увеличилось в 2-4 раза. Причем есть разные реализации юникода в разных ОС. Старые не поддерживали 4 а значит возможен глюк.

Добавлено через 11 минут
А вообще, инетересно, кто-нибудь (из Вас) еще кодит для консоли? Под Win или Linux? Слышал (активно не работал) что весь линукс работает в консоли и в основном написана на с/с++
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.09.2014, 18:26
Цитата Сообщение от Tester64 Посмотреть сообщение
Не знаю с какой стороны она изнутри юникоидная...
Windows юникодная изнутри. Консоль не юникодная по-умолчанию, и это сделано по всей видимости лишь для совместимости со старым ПО. Если мы пишем новое ПО нет никакой нужды подстраиваться под это. В VS например достаточно написать:
C++
1
_setmode(_fileno(stdout), _O_U16TEXT);
Чтобы перевести консоль в режим UTF16, соответственно, при наличии правильных шрифтов, wcout, wstring будут работать без каких-либо перекодировок.

Цитата Сообщение от Tester64 Посмотреть сообщение
Но консоль осталась в 1251
По-умолчанию она вообще в 866 кодировке (ДОС) в русской windows.

Цитата Сообщение от Tester64 Посмотреть сообщение
Слышал (активно не работал) что весь линукс работает в консоли и в основном написана на с/с++
Ну это не правда, что прям весь . Но консольные утилиты там гораздо лучше себя чувствуют, чем в windows, в том числе засчет развитой командной оболочки. Кстати в любом линуксе по-умолчанию используется кодировка юникода UTF-8.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
01.09.2014, 23:23
Цитата Сообщение от gru74ik Посмотреть сообщение
Ну и зачем стёр? Многим наверное было бы и полезно и интересно. Мне вот, например, интересно.
+1. Мне тоже всегда интересно почитать имхи специалистов, тем более, если им можно потом еще задать вопрос. А вики мы в любом случае почитать можем.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
02.09.2014, 06:46
Цитата Сообщение от Tester64 Посмотреть сообщение
Слышал (активно не работал) что весь линукс работает в консоли
Там всё вполне себе цивилизованно - окошечки, менюшечки. Попробуй ради интереса Ubuntu поставить, к примеру. Посмотришь сам.
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
02.09.2014, 17:36  [ТС]
Цитата Сообщение от gru74ik Посмотреть сообщение
Там всё вполне себе цивилизованно - окошечки, менюшечки. Попробуй ради интереса Ubuntu поставить, к примеру. Посмотришь сам
"По приколу" делать это не хочется, а для работы не нужно (на 80% привязан к винде - остальное веб). Конечно раньше ставил (в виртуальные машины), даже где-то в коллекции лежит... Конечно там можно включить графику и работать только в ней. Но меня инетересует не это! Насколько сейчас активно кодят под консоль в С++? Нужна ли эта технология еще? Или давно замещена графикой? Конечно понимаю, что все сетевые технологии консольные, но кроме сетей?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.09.2014, 18:17
Цитата Сообщение от Tester64 Посмотреть сообщение
Насколько сейчас активно кодят под консоль в С++?
Нет такого понятия "кодить под консоль".
Есть прикладное ПО, которое может быть с графическим или текстовым интерфейсом. Пользовательский интерфейс - это только малая часть процесса разработки ПО, поэтому вакансии "кодить под консоль" и не найдешь. Потому что обычно "кодят", чтобы решить некую задачу, а текстовый у этой программы будет интерфейс или графический - это не столь важно, это системные архитекторы и дизайнеры пусть решают.
Причем, помимо прикладного ПО есть еще куча разного системного и околосистемного софта: сервисы, библиотеки, драйвера, embedded ПО, ядра ОС, физические движки игр и т.д. и т.п., для которых вообще не применимо понятие пользовательский интерфейс (или этот интерфейс штука специфическая, например две кнопки на устройстве вкл. и выкл.). Эта категория тоже занимает довольно ощутимую долю рынка. Мы ее не рассматриваем что ли?
1
Модератор
Эксперт NIX
 Аватар для NeoMatrix
8532 / 3348 / 105
Регистрация: 24.05.2011
Сообщений: 14,554
Записей в блоге: 8
02.09.2014, 20:58
Цитата Сообщение от Tester64 Посмотреть сообщение
весь линукс работает в консоли
Я вас умоляю! Для повышения вашего уровня эрудиции в этом вопросе крайне рекомендую зайти хотя бы в Windows vs Linux (0Dh) или У кого как выглядит рабочий стол? (2), где вполне достаточно скринов рабстолов линукс
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
05.11.2020, 14:09
Цитата Сообщение от DrOffset Посмотреть сообщение
Tester64, тут еще ведь нужно понимать, что L"строка" - это не UTF8. Это скорее UTF16 или USC2, если рассматривать windows.
Конвертирование же именно UTF8 в CP1251 под windows можно так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::string UTF8_to_CP1251(std::string const & utf8)
{
    if(!utf8.empty())
    {
        int wchlen = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), utf8.size(), NULL, 0);
        if(wchlen > 0 && wchlen != 0xFFFD)
        {
            std::vector<wchar_t> wbuf(wchlen);
            MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), utf8.size(), &wbuf[0], wchlen);
            std::vector<char> buf(wchlen);
            WideCharToMultiByte(1251, 0, &wbuf[0], wchlen, &buf[0], wchlen, 0, 0);
 
            return std::string(&buf[0], wchlen);
        }
    }
    return std::string();
}
Я немного запутался, разве MultiByteToWideChar - может конвертировать из UTF8 в CP1251 ?
Вроде бы MultiByteToWideChar - конвертирует Из указанной в первом параметре кодировке ---> всегда в UTF-16 ?

Добавлено через 5 минут
Блин, понял, сначала конвертируем из UTF8 в UTF16, а потом из UTF16 в CP1251.

А с точки зрения производительности - это ж двойные затраты получаются ? Может есть более быстрый способ конвертации между кодировками ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2020, 14:09
Помогаю со студенческими работами здесь

UTF-16 -> cp-1251(windows-1251)
У меня есть кириллическая строка UTF-16, которая выглядит как Хотелось бы конвертнуть её в cp-1251, чтобы она была читаема. Сколько...

Преобразование string* в string
Здравствуйте, друзья. У меня есть класс. В нем описано поле string *GPS; В конструкторе выделяю память. Передаю именно *_GPS для...

Преобразование string в int
Всем привет, нужно преобразовать string в int #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include...

Преобразование string в int
Добрый день. Есть переменная типа string, в которой записана цифра. Как мою строку перевести к int?

Преобразование string в int
Помогите пожалуйста с преобразованием string к типу int, быть может не напрямую но хоть как нибудь, очень надо!!!


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru