2015-12-02 7 views
0

Преобразование CString к int в режиме ASCII так просто, какпреобразовать CString МФЦ в целое как для ASCII и UNICODE

CString s("123"); 
int n = atoi(s); 

Однако это не работает для проектов в режиме UNICODE, как CString становится широко голец строка.

Как написать свой код для покрытия как режимов ASCII, так и UNICODE без дополнительных сообщений if?

ответ

2

Оказывается, есть _ttoi() доступны только для этой цели:

CString s(_T("123")); 
int n = _ttoi(s); 

Это работает для обоих режимов без каких-либо дополнительных усилий.

Если вам необходимо преобразовать шестнадцатеричный (или другую базу) номер вы можете прибегнуть к более общей strtol() варианта:

CString s(_T("0xFA3")); 
int n = _tcstol(s, nullptr, 16); 
3

Там специальная версия CString, которая использует многобайтовые символы, даже если ваша сборка определена для широких символов - CStringA. Он также автоматически преобразуется из широких символов.

CString s(_T("123")); 
CStringA sa = s; 
int n = atoi(sa); 

Существует соответствующий CStringW, который использует только широкие символы.

+0

Я специально хотел избежать любого вида двойного кодирования. Поэтому нет 'CStringA' и' CStringW', no-no-no. В дополнение к этому не все строки с широким символом конвертируются в ASCII без правильной «локали», и хотя мой короткий пример показал упрощенный текст, строки часто исходят из токенизации широкого диапазона входных данных, и я не хочу отлаживать UNICODE вопросы, TBH. – YePhIcK

+0

@YePhIcK ** 1. ** Если у вас есть дополнительные ограничения, они должны были быть частью вопроса изначально. ** 2. ** Поскольку 'atoi' не может обрабатывать символы, кроме цифр, не имеет значения, какие символы Unicode существуют в исходной строке. –

+0

Я согласен с обоими твоими очками. Однако моя точка w.r.t. # 2 было то, что вы не можете просто предположить, что 'CStringA' будет конвертировать из UNICODE без проблем – YePhIcK

Смежные вопросы