Здравствуйте, Ubivetz, Вы писали:
U>Привет всем!
U>Как можно кроссплатформенно преобразовать wstring в string? U>Пробую через codecvt но не получается. Может есть у кого рабочий код?
Насколько я понимаю вопрос без специальных либ (типа ICU) не обойтись. С ними — можно.Насколько я помню юникод в лиукс-системах определен как 32-битное целое в отличие от 16-и битного в виндовс.
Re[2]: Кроссплатформенное преобразование wstring в string
ICU как вариант — но очень толстая.
Можно проще — все что наружу сохранять в utf8, внутри обычный basic_string<wchar_t> в котором в зависимости от размера wchar_t — 2 или 4 байта, лежит utf16 или utf32 соответственно.
Re[2]: Кроссплатформенное преобразование wstring в string
Здравствуйте, StevenIvanov, Вы писали:
SI>Здравствуйте, Ubivetz, Вы писали:
U>>Привет всем!
U>>Как можно кроссплатформенно преобразовать wstring в string? U>>Пробую через codecvt но не получается. Может есть у кого рабочий код?
SI>Насколько я понимаю вопрос без специальных либ (типа ICU) не обойтись. С ними — можно.Насколько я помню юникод в лиукс-системах определен как 32-битное целое в отличие от 16-и битного в виндовс.
Ну...юникод вообще-то в современных Linux и MacOS X мультибайтный UTF-8.
Что интересно, sizeof(wchar_t) = 4 в Mac OS X 10.4.x
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Re: Кроссплатформенное преобразование wstring в string
Здравствуйте, Ubivetz, Вы писали:
U>Как можно кроссплатформенно преобразовать wstring в string? U>Пробую через codecvt но не получается. Может есть у кого рабочий код?
В первом приближении как-то так:
Re: Кроссплатформенное преобразование wstring в string
От:
Аноним
Дата:
10.07.08 09:07
Оценка:
Здравствуйте, Ubivetz, Вы писали:
U>Как можно кроссплатформенно преобразовать wstring в string? U>Пробую через codecvt но не получается. Может есть у кого рабочий код?
Здравствуйте, Conr, Вы писали:
C>Здравствуйте, Ubivetz, Вы писали:
U>>Как можно кроссплатформенно преобразовать wstring в string? U>>Пробую через codecvt но не получается. Может есть у кого рабочий код? C>В первом приближении как-то так:
Здравствуйте, Conr, Вы писали:
C>Здравствуйте, Ubivetz, Вы писали:
U>>Как можно кроссплатформенно преобразовать wstring в string? U>>Пробую через codecvt но не получается. Может есть у кого рабочий код? C>В первом приближении как-то так:
Здравствуйте, Ubivetz, Вы писали:
U>Ну...юникод вообще-то в современных Linux и MacOS X мультибайтный UTF-8. U>Что интересно, sizeof(wchar_t) = 4 в Mac OS X 10.4.x
Это у всех gcc по умолчанию — чтобы туда UCS-4 влез.
Можно принудить к UTF-16/UCS-2 с помощью ключа -fshort-wchar
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Кроссплатформенное преобразование wstring в string
Здравствуйте, Conr, Вы писали:
C>Здравствуйте, Ubivetz, Вы писали:
U>>Как можно кроссплатформенно преобразовать wstring в string? U>>Пробую через codecvt но не получается. Может есть у кого рабочий код? C>В первом приближении как-то так:
<SNIP>
зачем тока пользовать некошеный memcpy? std::copy для этого есть... в итоге конечно все равно буит memcpy, но код, imho, станет красивше )
Re[4]: Кроссплатформенное преобразование wstring в string
Здравствуйте, Ubivetz, Вы писали:
U>Некроссплатформенно не нужно. Нужно чтобы работало как минимум на W2k-Vista и MacOS X 10.3.9+
В этом случае, кстати, будет лучше написать 2 реализации — под Win32 и MacOS, использующие родные функции преобразования:
Здравствуйте, Ubivetz, Вы писали: U>Как можно кроссплатформенно преобразовать wstring в string?
Если надобно транслировать коджировки туда-сюда, например в данном случае UCS-2-INTERNAL (или UTF-16) в SOME_LOCAL_CHARSET и наоборот, то, имхо, лучшим решением окажется не написание всевозможных велосипедов, а использование проверенного кроссплатформенного решения: iconv POSIX-compliant charset conversion library.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Re: Кроссплатформенное преобразование wstring в string
Здравствуйте, Ubivetz, Вы писали:
U>Привет всем!
U>Как можно кроссплатформенно преобразовать wstring в string? U>Пробую через codecvt но не получается. Может есть у кого рабочий код?
либо boost::lexical_cast
либо руками
template<class T, class A> std::wstring to_unicode(
std::basic_string<char, T, A> const& in,
std::locale const& loc = std::locale())
{
typedef std::codecvt<wchar_t, char, std::mbstate_t> facet;
const facet& cvt = std::use_facet<facet>(loc);
std::wstring out;
out.reserve(in.length());
facet::state_type state = facet::state_type();
const char *ibuf = in.data(), *iend = in.data() + in.size();
while(ibuf != iend)
{
wchar_t obuf[MAX_PATH], *oend;
facet::result res = cvt.in (state, ibuf, iend, ibuf, obuf, obuf + MAX_PATH, oend = obuf);
if( res == facet::error ) { state = facet::state_type(); ibuf += 1; }
out.append(obuf, oend - obuf);
if( res == facet::error ) out += L'?';
}
return out;
}
template<class T, class A> std::string to_multibyte(
std::basic_string<wchar_t, T, A> const& in,
std::locale const& loc = std::locale())
{
typedef std::codecvt<wchar_t,char,std::mbstate_t> facet;
facet const& cvt = std::use_facet<facet>(loc);
std::string out;
out.reserve(in.length());
facet::state_type state = facet::state_type();
const wchar_t *ibuf = in.data(), *iend = in.data() + in.size();
char obuf[MAX_PATH], *oend;
while(ibuf != iend)
{
facet::result res = cvt.out(state, ibuf, iend, ibuf, obuf, obuf + MAX_PATH, oend = obuf);
if( res == facet::error ) { state = facet::state_type(); ibuf += 1; }
out.append(obuf, oend - obuf);
if( res == facet::error ) out += L'?';
}
if( state == facet::partial )
{
cvt.unshift(state, obuf, obuf + MAX_PATH, oend = obuf);
out.append (obuf, oend - obuf);
}
return out;
}