atoi () с другими языками - PullRequest
6 голосов
/ 21 июня 2011

Я работаю над проектом интернационализации.Используют ли другие языки, такие как арабский или китайский, другое представление для цифр, кроме 0-9?Если да, существуют ли версии atoi (), которые будут учитывать эти другие представления?

Я должен добавить, что в основном я занимаюсь анализом ввода от пользователя.Если пользователи вводят другое представление, я хочу быть уверенным, что я распознаю его как число и отношусь к нему соответствующим образом.

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

Я могу использовать std::wistringstream и локаль для генерации этого целого числа.

#include <sstream>
#include <locale>
using namespace std;

int main()
{
  locale mylocale("en-EN"); // Construct locale object with the user's default preferences
  wistringstream wss(L"1");  // your number string
  wss.imbue( mylocale );    // Imbue that locale
  int target_int = 0;
  wss >> target_int;
  return 0;
}

Больше информации о классе потока и о классе локали .

2 голосов
/ 21 июня 2011

Если вас беспокоят международные символы, вам необходимо убедиться, что вы используете функцию с поддержкой Unicode, например _wtoi (..).

Вы также можете проверить, поддерживается ли UNICODE, чтобы сделать его независимым от типа (от MSDN ):

TCHAR tstr[4] = TEXT("137");

#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
                   // room for the multibyte characters if they are two 
                   // bytes long and a terminating null character. See Security 
                   // Alert below. 

wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);

#else

int num = atoi(tstr);

#endif 

В этом примере стандарт C функция библиотеки переводит wcstombs Юникод в ASCII. Пример полагается на то что цифры от 0 до 9 всегда можно перевести с Unicode для ASCII, даже если некоторые из окружающий текст не может. Атои Функция останавливается на любом символе, который не цифра.

Ваше приложение может использовать Национальный Поддержка языков (NLS) LCMapString функция для обработки текста, который включает в себя родные цифры предоставлены для некоторых скрипты в Юникоде.

Внимание! Использование функции wcstombs неправильно может поставить под угрозу безопасность вашего приложения. Делать уверен, что буфер приложения для строка из 8-битных символов находится на наименьший размер 2 * (char_length +1), где char_length представляет длина строки Unicode. это ограничение сделано потому, что с двухбайтовые наборы символов (DBCS), каждый символ Unicode может быть сопоставлен до двух последовательных 8-битных символов. Если буфер не содержит весь строка, строка результата не терминирует, создает безопасность риск. Для получения дополнительной информации о безопасность приложения, см. Безопасность Соображения: Международный Особенности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...