Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

std::string

7.5K
10 декабря 2011 года
diprom
37 / / 15.10.2010
Здравствуйте, помогите составить функцию.
На входе std::string, в которой содержится текст в формате, наверное unicode.
Вот такая строка: Тращенко Антон Владимирови&#x447
Необходимо ее вернуть в char.
Спасибо.
278
10 декабря 2011 года
Alexander92
1.1K / / 04.08.2008
string::c_str(), не?
7.5K
11 декабря 2011 года
diprom
37 / / 15.10.2010
Уже много вариантов получается.
НЕ пойму, почему на выходе нет русского текста Санкт-Петербург?
Уже функцию переписал:


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;
}

Как все-таки мне вывести русский текст Санкт-Петербург из исходного?
7.5K
11 декабря 2011 года
diprom
37 / / 15.10.2010
Все решил.

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;
}
7.5K
11 декабря 2011 года
diprom
37 / / 15.10.2010
Сейчас нашел неточность.
Почему данный код срабатывает для всех букв, кроме И?
Может эксперты знают?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог