std::string
На входе std::string, в которой содержится текст в формате, наверное unicode.
Вот такая строка: Тращенко Антон Владимирович
Необходимо ее вернуть в char.
Спасибо.
string::c_str(), не?
НЕ пойму, почему на выходе нет русского текста Санкт-Петербург?
Уже функцию переписал:
LPSTR UnicodeToAnsi(LPCWSTR s)
{
if (s==NULL) return NULL;
int cw=lstrlenW(s);
if (cw==0) {CHAR *psz=new CHAR[1];*psz='\0';return psz;}
int cc=WideCharToMultiByte(CP_ACP,0,s,cw,NULL,0,NULL,NULL);
if (cc==0) return NULL;
CHAR *psz=new CHAR[cc+1];
cc=WideCharToMultiByte(CP_ACP,0,s,cw,psz,cc,NULL,NULL);
if (cc==0) {delete[] psz;return NULL;}
psz[cc]='\0';
return psz;
}
Как все-таки мне вывести русский текст Санкт-Петербург из исходного?
char *a = unicode_to_1251((wchar_t*)INPUT);
std::string f = Utf8_to_cp1251(a);
CharToOem(f.c_str(),(LPSTR)f.c_str());
printf("\tregion - [%s]\n",f.c_str());
delete[] a;
char * unicode_to_1251(wchar_t *unicode_string)
{
int err;
char * res;
int res_len = WideCharToMultiByte(
1251, // Code page
0, // Default replacement of illegal chars
unicode_string, // Multibyte characters string
-1, // Number of unicode chars is not known
NULL, // No buffer yet, allocate it later
0, // No buffer
NULL, // Use system default
NULL // We are not interested whether the default char was used
);
if (res_len == 0)
{
printf("Failed to obtain required cp1251 string length\n");
return NULL;
}
res = (char*)calloc(sizeof(char), res_len);
if (res == NULL)
{
printf("Failed to allocate cp1251 string\n");
return NULL;
}
err = WideCharToMultiByte(
1251, // Code page
0, // Default replacement of illegal chars
unicode_string, // Multibyte characters string
-1, // Number of unicode chars is not known
res, // Output buffer
res_len, // buffer size
NULL, // Use system default
NULL // We are not interested whether the default char was used
);
if (err == 0)
{
printf("Failed to convert from unicode\n");
free(res);
return NULL;
}
return res;
}
std::string Utf8_to_cp1251(const char *str)
{
std::string res;
int result_u, result_c;
result_u = MultiByteToWideChar(CP_UTF8,
0,
str,
-1,
0,
0);
if (!result_u)
return 0;
wchar_t *ures = new wchar_t[result_u];
if(!MultiByteToWideChar(CP_UTF8,
0,
str,
-1,
ures,
result_u))
{
delete[] ures;
return 0;
}
result_c = WideCharToMultiByte(
1251,
0,
ures,
-1,
0,
0,
0, 0);
if(!result_c)
{
delete [] ures;
return 0;
}
char *cres = new char[result_c];
if(!WideCharToMultiByte(
1251,
0,
ures,
-1,
cres,
result_c,
0, 0))
{
delete[] cres;
return 0;
}
delete[] ures;
res.append(cres);
delete[] cres;
return res;
}
Почему данный код срабатывает для всех букв, кроме И?
Может эксперты знают?