Вопрос в том, как преобразовать строку в строку?
У меня есть следующий пример:
#include <string>
#include <iostream>
int main()
{
std::wstring ws = L"Hello";
std::string s( ws.begin(), ws.end() );
//std::cout <<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::cout <<"std::string = "<<s<<std::endl;
}
вывод с закомментированной строкой:
std::string = Hello
std::wstring = Hello
std::string = Hello
но без только:
std::wstring = Hello
Что-то не так в примере? Могу ли я сделать преобразование, как указано выше?
РЕДАКТИРОВАТЬ
Новый пример (с учетом некоторых ответов)
#include <string>
#include <iostream>
#include <sstream>
#include <locale>
int main()
{
setlocale(LC_CTYPE, "");
const std::wstring ws = L"Hello";
const std::string s( ws.begin(), ws.end() );
std::cout<<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::stringstream ss;
ss << ws.c_str();
std::cout<<"std::stringstream = "<<ss.str()<<std::endl;
}
Выход:
std::string = Hello
std::wstring = Hello
std::stringstream = 0x860283c
поэтому поток строки нельзя использовать для преобразования wstring в строку.
std::wstring
вообще использовать ? stackoverflow.com/questions/1049947/...Ответы:
Вот разработанное решение, основанное на других предложениях:
Обычно это работает для Linux, но создает проблемы в Windows.
источник
std::setlocale(LC_ALL, "");
действительно необходимо?std::wcout.imbue(locale)
должно делать работу так же хорошо, и оно имеет то преимущество, что оно не меняет глобального состояния.std::wstring_convert
C ++ 11 много шума.*** glibc detected *** test: malloc(): smallbin double linked list corrupted: 0x000000000180ea30 ***
на Linux 64-бит (gcc 4.7.3). Кто-нибудь еще испытывает это?Как отметил Cubbi в одном из комментариев,
std::wstring_convert
(C ++ 11) предлагает простое и удобное решение (вам нужно#include
<locale>
и<codecvt>
):Я использовал комбинацию
wcstombs
и утомительное распределение / освобождение памяти, прежде чем я столкнулся с этим.http://en.cppreference.com/w/cpp/locale/wstring_convert
обновление (2013.11.28)
Один лайнер можно сформулировать так (спасибо, Гусс, за ваш комментарий):
Функции оболочки могут быть сформулированы так: (Спасибо, ArmanSchwarz за комментарий)
Примечание: есть некоторые споры о том
string
/wstring
должно быть переданы и функции как ссылка или как литералы (из - за C ++ 11 и компилятор обновлений). Я оставлю решение человеку, осуществляющему, но это стоит знать.Примечание: я использую
std::codecvt_utf8
в приведенном выше коде, но если вы не используете UTF-8, вам нужно изменить его на соответствующую кодировку:http://en.cppreference.com/w/cpp/header/codecvt
источник
std::wstring str = std::wstring_convert<std::codecvt_utf<wchar_t>>().from_bytes("some string");
Решение от: http://forums.devshed.com/c-programming-42/wstring-to-string-444006.html
Помните, что здесь не происходит никакого преобразования набора символов. Что это делает просто присвоить каждую итерацию
wchar_t
кchar
- усечению преобразования. Он использует std :: string c'tor :Как указано в комментариях:
-
И обратите внимание, что кодовые точки в диапазоне
0x80 - 0x9F
в Win1252 не будут работать. Это включает в себя€
,œ
,ž
,Ÿ
, ...источник
Вместо того, чтобы включать локаль и все эти причудливые вещи, если вы знаете, что для FACT ваша строка конвертируема, просто сделайте это:
Живой пример здесь
источник
Я полагаю, что официальный путь все еще состоит в том, чтобы идти
codecvt
гранями (вам нужен какой-то перевод с учетом местных особенностей ), как вили что-то в этом роде, у меня нет рабочего кода. Но я не уверен, сколько людей в наши дни используют этот механизм, а сколько просто запрашивают указатели на память и позволяют ICU или какой-либо другой библиотеке обрабатывать мрачные детали.
источник
Есть две проблемы с кодом:
Преобразование в
const std::string s( ws.begin(), ws.end() );
не требуется для правильного сопоставления широких символов с их узким аналогом. Скорее всего, каждый широкий символ будет просто соответствовать типуchar
.Решение этой проблемы уже дано в ответе Кемом и включает
narrow
функциюctype
аспекта локали .Вы пишете вывод для обеих
std::cout
иstd::wcout
в одной и той же программе. Обаcout
иwcout
связаны с одним и тем же потоком (stdout
), и результаты использования одного и того же потока как байтового потока (как этоcout
делается), так и широкого ориентированного потока (как этоwcout
делается) не определены.Лучший вариант - избегать смешивания узких и широких выходных данных с одним и тем же (базовым) потоком. Для
stdout
/cout
/wcout
вы можете попробовать изменить ориентациюstdout
при переключении между широким и узким выходом (или наоборот):источник
Этот код имеет две формы для преобразования std :: string в std :: wstring и std :: wstring в std :: string. Если вы отрицаете # если определен WIN32, вы получите тот же результат.
1. std :: string to std :: wstring
• MultiByteToWideChar WinAPI
• _mbstowcs_s_l
2. std :: wstring в std :: string
• WideCharToMultiByte WinAPI
• _wcstombs_s_l
3. На windows нужно распечатать юникод, используя WinAPI.
• WriteConsole
4. По основной программе.
5. Наконец, вам нужна мощная и полная поддержка символов Юникода в консоли. Я рекомендую ConEmu и установить в качестве терминала по умолчанию в Windows . Вам нужно подключить Visual Studio к ConEmu. Помните, что исполняемый файл Visual Studio - devenv.exe
результат
источник
Вы могли бы также просто использовать узкий метод фасета ctype напрямую:
источник
На момент написания этого ответа поисковая система Google номер один "преобразовать строку wstring" попадет на эту страницу. Мой ответ показывает, как преобразовать строку в wstring, хотя это не фактический вопрос, и я, вероятно, должен удалить этот ответ, но это считается плохой формой. Вы можете перейти к этому ответу StackOverflow , который теперь имеет более высокий рейтинг, чем эта страница.
Вот способ объединения строковых, wstring и смешанных строковых констант в wstring. Используйте класс wstringstream.
источник
Помимо простого преобразования типов, вы также должны помнить о фактическом формате строки.
При компиляции для многобайтового набора символов Visual Studio и Win API предполагают UTF8 (собственно Windows-кодировка Windows-28591 ).
При компиляции для набора символов Unicode Visual Studio и Win API предполагают UTF16.
Таким образом, вы должны также преобразовать строку из формата UTF16 в формат UTF8, а не просто преобразовать в std :: string.
Это станет необходимым при работе с многосимвольными форматами, такими как некоторые нелатинские языки.
Идея состоит в том, чтобы решить, что
std::wstring
всегда представляет UTF16 .И
std::string
всегда представляет UTF8 .Это не обеспечивается компилятором, это скорее хорошая политика. Обратите внимание на строковые префиксы, которые я использую для определения UTF16 ( L ) и UTF8 ( u8 ).
Для преобразования между двумя типами вы должны использовать: std :: codecvt_utf8_utf16 <wchar_t>
источник
В моем случае я должен использовать многобайтовые символы (MBCS), и я хочу использовать std :: string и std :: wstring. И не могу использовать с ++ 11. Поэтому я использую mbstowcs и wcstombs.
Я делаю ту же функцию с использованием new, delete [], но это медленнее, чем это.
Это может помочь Как: конвертировать между различными типами строк
РЕДАКТИРОВАТЬ
Однако, в случае преобразования в строку wstring и исходную строку нет алфавита и многобайтовой строки, это не работает. Поэтому я меняю wcstombs на WideCharToMultiByte.
РЕДАКТИРОВАТЬ, чтобы использовать «MultiByteToWideChar» вместо «wcstombs»
источник
wcstombs()
.Это решение вдохновлено решением dk123 , но использует зависящий от локали аспект codecvt. Результат находится в кодированной строке локали вместо UTF-8 (если она не установлена как локаль):
Я искал это, но я не могу найти это. Наконец, я обнаружил, что могу получить правильный аспект,
std::locale
используяstd::use_facet()
функцию с правильным именем типа. Надеюсь это поможет.источник
В случае , если кто - то заинтересован: мне нужен класс , который можно было бы использовать как взаимозаменяемые , где либо
string
илиwstring
ожидался. Следующий классconvertible_string
, основанный на решении dk123 игровых , может быть инициализирован либоstring
,char const*
,wstring
илиwchar_t const*
и может быть назначен на или неявно преобразовать либо вstring
илиwstring
(так можно передать в функцию , которые принимают либо).источник
std::wstring
в классе, чем хранитьstd::string
и делать преобразование,std::wstring
когда это необходимо, чтобы получитьstd::wstring
. Потому чтоstd::wstring
это несколько быстрееstd::string
и лучше совместимо. Даже он потребляет больше памяти, чемstd::string
.источник
Я использую ниже, чтобы преобразовать wstring в строку.
источник
<string>
) и определения дляWideCharToMultiByte()
- это какая-то оберткаstd::wctomb()
?источник