2011-06-21 59 views
6

Tôi đang làm việc trong một dự án quốc tế hóa. Làm các ngôn ngữ khác, chẳng hạn như tiếng Ả Rập hay tiếng Trung, sử dụng các biểu diễn khác nhau cho các chữ số bên cạnh 0-9? Nếu có, có phiên bản nào của atoi() sẽ tính đến các đại diện khác không?atoi() với các ngôn ngữ khác

Tôi nên thêm rằng tôi chủ yếu quan tâm đến phân tích cú pháp đầu vào từ người dùng. Nếu người dùng gõ vào một số đại diện khác tôi muốn chắc chắn rằng tôi nhận ra nó như là một số và xử lý nó cho phù hợp.

+0

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

+0

Nên giải thích về liên kết: Việc sử dụng 'wchar_t' có ý nghĩa trên hệ thống của bạn hay không phụ thuộc vào về loại mã hóa bạn đang sử dụng; đối với UTF-8, 'strtol()'/'atoi()' thông thường sẽ làm, nhưng nếu bạn có các bộ ký tự nhiều byte/không đổi thì chúng sẽ không. –

Trả lời

6

Tôi có thể sử dụng std::wistringstream và ngôn ngữ để tạo số nguyên này.

#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 classon locale class.

+0

+1 cho giải pháp Chuẩn, mặc dù nó phụ thuộc nhiều vào các ngôn ngữ C có sẵn trên hệ thống. – rubenvb

2

Nếu bạn quan tâm đến các ký tự quốc tế, thì bạn cần đảm bảo bạn sử dụng chức năng "nhận thức Unicode" như _wtoi (..).

Bạn cũng có thể kiểm tra xem UNICODE được hỗ trợ để làm cho nó gõ độc lập (từ 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 

Trong ví dụ này, tiêu chuẩn C wcstombs chức năng thư viện dịch Unicode sang ASCII. Ví dụ dựa trên trên thực tế là các chữ số 0 đến 9 luôn có thể được dịch từ Unicode thành ASCII, ngay cả khi một số văn bản xung quanh không thể. Chức năng atoi dừng ở bất kỳ ký tự nào mà không phải là chữ số.

Ứng dụng của bạn có thể sử dụng Hỗ trợ Ngôn ngữ Quốc gia (NLS) LCMapString chức năng để xử lý văn bản bao gồm các chữ số tự nhiên cung cấp cho một số các script trong Unicode.

Thận trọng Sử dụng chức năng wcstombs không chính xác có thể làm tổn hại đến bảo mật của đơn đăng ký của bạn. Tạo chắc chắn rằng bộ đệm ứng dụng cho chuỗi ký tự 8 bit ở mức ít nhất là kích thước 2 * (char_length +1), trong đó char_length biểu thị độ dài của chuỗi Unicode. Giới hạn này được thực hiện vì, với bộ ký tự 2 byte (DBCS), mỗi ký tự Unicode có thể được ánh xạ thành hai ký tự 8 bit liên tiếp. Nếu bộ đệm không giữ toàn bộ chuỗi , chuỗi kết quả không phải là vô hiệu hóa, đặt ra một bảo mật rủi ro. Để biết thêm thông tin về bảo mật ứng dụng , hãy xem Bảo mật Các cân nhắc: International Tính năng.

+0

Tôi nghĩ rằng Visual C++ có một số được xây dựng trong macro mà hầu hết chuyển đổi này cho bạn. – Brian

Các vấn đề liên quan