суббота, 31 декабря 2011 г.

UnicodeString to char* (Embarcadero C++ Builder 2010)

Работая в 2010м билдере полностью в нем разочаровался. Список багов довольно длинный. Также обнаружилась новая "фича": метод c_str() класса UnicodeString, теперь также как и w_str() возвращает wchar_t*. Для получения char* пришлось найти другие выходы.
Итак, решение №1 (проверено):

char* wctoansi(UnicodeString us) {
wchar_t* wstr = us.c_str();
char* ascii = new char[wcslen(wstr) + 1];
wctomb(ascii, *wstr);
return ascii;
}

И решение №2 (не проверено):

char* asAnsi(wchar_t* wstr) {
char* ansi = new char[wcslen(wstr) + 1];
for (UINT i = 0; i < wcslen(wstr) / 2; i++) {
int srca = wstr[i];
if (srca >= int(L"а") && srca <= int(L"я"))
ansi[i] = int("a") + (srca -int(L"а"));
else if (srca >= int(L"А") && srca <= int(L"Я"))
ansi[i] = int("А") + (srca -int(L"А"));
else {
ansi[i] = (char)wstr[i];
if (wstr[i] == 0)
break;
}
}
return ansi;
}


Творческих успехов!