2011-06-21 15 views
6

Pracuję nad projektem internacjonalizacji. Czy inne języki, takie jak arabski lub chiński, używają innych reprezentacji cyfr oprócz cyfr 0-9? Jeśli tak, to czy istnieją wersje atoi(), które będą uwzględniać te inne reprezentacje?atoi() z innymi językami

Należy dodać, że głównie chodzi mi o analizowanie danych wejściowych od użytkownika. Jeśli użytkownicy wpisują inną reprezentację, chcę mieć pewność, że rozpoznaję ją jako liczbę i traktuję ją odpowiednio.

+0

http://stackoverflow.com/questions/5068972/c-atoi-for-wide-chars-on-linux –

+0

Powinny wyjaśnić na łączu: Czy użycie 'wchar_t' ma sens w systemie, czy nie zależy jakiego rodzaju kodowania używasz; w przypadku UTF-8, zrobiłoby to zwykłe 'strtol()'/'atoi()', ale jeśli masz wielobajtowe/stałe zbiory znaków, nie będą. –

Odpowiedz

6

Mogę używać std::wistringstream i locale do generowania tej liczby całkowitej.

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

More info on stream class i on locale class.

+0

+1 dla rozwiązania standardowego, chociaż w dużym stopniu zależy od ustawień regionalnych dostępnych w systemie. – rubenvb

2

Jeśli niepokoisz się znakami międzynarodowymi, musisz upewnić się, że używasz funkcji "Unicode-aware", takiej jak _wtoi (..).

Można również sprawdzić, czy Unicode jest obsługiwany, aby wpisać niezależny (od 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 

W tym przykładzie, standard C Biblioteka funkcji wcstombs przekłada Unicode do ASCII. Przykład opiera się na tym, że cyfry od 0 do 9 zawsze można przetłumaczyć z Unicode na ASCII, nawet jeśli część otaczającego tekstu nie może. Funkcja atoi zatrzymuje się przy dowolnym znaku, który nie jest cyfrą.

Aplikacja może używać Narodowy Language Support (NLS) LCMapString funkcji do przetwarzania tekstu, który zawiera rodzimych cyfry przewidziane dla niektórych skryptów w Unicode.

Przestroga Używanie funkcji wcstombs powoduje niepoprawne złamanie zabezpieczeń aplikacji . Spraw, aby był pewny, że bufor aplikacji dla łańcucha znaków 8-bitowych ma wartość najmniejszy rozmiar 2 * (char_length +1), , gdzie char_length reprezentuje długość ciągu znaków Unicode. Ograniczenie to zostało wprowadzone, ponieważ z dwubajtowymi zestawami znaków (DBCS), każdy znak Unicode może zostać odwzorowany na na dwa kolejne znaki 8-bitowe. Jeśli bufor nie zawiera całego ciągu znaków , ciąg wyniku nie jest zakończony wartością null, co stanowi ryzyko związane z zabezpieczeniem . Aby uzyskać więcej informacji na temat zabezpieczeń aplikacji , zobacz Zabezpieczenia Rozważania: Międzynarodowe Funkcje.

+0

Myślę, że Visual C++ ma niektóre wbudowane makra, które wykonują większość tego przełączania dla ciebie. – Brian

Powiązane problemy