atoi()其他语言

问题描述:

我正在开展国际化项目。除了0-9之外,其他语言如阿拉伯语或中文是否使用不同的数字表示?如果是这样,是否有atoi()版本会解释这些其他表示?atoi()其他语言

我应该补充一点,我主要关注解析来自用户的输入。如果用户输入其他表示,我想确保我将它识别为一个数字并相应地对其进行处理。

+0

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

+0

应该在链接上解释:wchar_t的使用是否对你的系统有意义取决于你正在使用什么样的编码;对于UTF-8,通常的'strtol()'/'atoi()'可以,但是如果你有多字节/常量大小的字符集,它们不会。 –

我可以用std::wistringstream和locale来产生这个整数。

#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 and on locale class

+0

对于标准解决方案而言,尽管它高度依赖于系统上可用的C语言环境, – rubenvb

如果您担心国际字符,那么您需要确保使用“Unicode-aware”功能,如_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转换 的Unicode为ASCII。该示例依赖于 ,因为从0到 9总是可以从 Unicode转换为ASCII,即使周围文本的某些不能。 atoi 函数停止在任何字符 不是一个数字。

您的应用程序可以使用国家 语言支持(NLS)LCMapString 函数来处理文本,包括 提供一些 以Unicode脚本中的本地数字。

警告错误地使用wcstombs函数 可能会危及您的应用程序的安全性 。使 确定应用程序缓冲区中的 的8位字符串至少为 * 2(char_length +1), ,其中char_length表示Unicode字符串的长度为 。由于 双字节字符集(DBCS), ,每个Unicode字符可以被映射为 到两个连续的8位字符,因此这是 限制。 如果缓冲区不包含整个 字符串,则结果字符串不是 以空字符结尾,从而构成安全性 风险。有关 应用程序安全性的更多信息,请参阅安全性 注意事项:国际 功能。

+0

我认为Visual C++有一些内置的宏,可以为你做这些切换的大部分。 – Brian