Широкие и узкие символы - PullRequest
       46

Широкие и узкие символы

4 голосов
/ 21 декабря 2009

Какой самый чистый способ преобразования std :: wstring в std :: string? В прошлом я использовал макросы W2A и др., Но они мне никогда не нравились.

Ответы [ 6 ]

5 голосов
/ 26 декабря 2009

Возможно, вам понадобится icu , кроссплатформенная библиотека с открытым исходным кодом, предназначенная для работы с Unicode и унаследованными кодировками, среди многих других вещей.

3 голосов
/ 14 апреля 2015

Так как это один из первых результатов поиска «узкой строки c ++», и это до C ++ 11, вот способ C ++ 11 для решения этой проблемы:

#include <codecvt>
#include <locale>
#include <string>

std::string narrow( const std::wstring& str ){
    std::wstring_convert<
        std::codecvt_utf8_utf16< std::wstring::value_type >,
        std::wstring::value_type
    > utf16conv;
    return utf16conv.to_bytes( str );
}
3 голосов
/ 26 декабря 2009

Самый нативный способ - std::ctype<wchar_t>::narrow(), но он делает чуть больше, чем std :: copy, как предложил gishu, и вам все еще нужно управлять своими собственными буферами.

Если вы не пытаетесь выполнить какой-либо перевод, а хотите получить только одну строку, вы можете сделать std::string my_string( my_wstring.begin(), my_wstring.end() ).

Если вам нужен реальный перевод кодировки, вы можете использовать locales / codecvt или одну из библиотек из другого ответа, но я предполагаю, что это не то, что вы ищете.

2 голосов
/ 26 декабря 2009

Если в строке wstring используется кодировка UTF-16 и требуется преобразование в строку в кодировке UTF-8, можно использовать библиотеку UTF8 CPP :

utf8::utf16to8(wstr.begin(), wstr.end(), back_inserter(str));
1 голос
/ 26 декабря 2009

Я не знаю, является ли это "самым чистым", но я до сих пор без проблем использовал функцию copy ().

#include <iostream>
#include <algorithm>

using namespace std;

string wstring2string(const wstring & wstr)     
{
    string str(wstr.length(),’ ‘);
    copy(wstr.begin(),wstr.end(),str.begin());
    return str;
}

wstring string2wstring(const string & str) 
{
    wstring wstr(str.length(),L’ ‘);
    copy(str.begin(),str.end(),wstr.begin());
    return wstr;
}

http://agraja.wordpress.com/2008/09/08/cpp-string-wstring-conversion/

1 голос
/ 21 декабря 2009

Посмотрите, поможет ли это. Этот использует std :: copy для достижения вашей цели.

http://www.codeguru.com/forum/archive/index.php/t-193852.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...