atoi()其他语言
我正在开展国际化项目。除了0-9之外,其他语言如阿拉伯语或中文是否使用不同的数字表示?如果是这样,是否有atoi()版本会解释这些其他表示?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;
}
对于标准解决方案而言,尽管它高度依赖于系统上可用的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位字符,因此这是 限制。 如果缓冲区不包含整个 字符串,则结果字符串不是 以空字符结尾,从而构成安全性 风险。有关 应用程序安全性的更多信息,请参阅安全性 注意事项:国际 功能。
我认为Visual C++有一些内置的宏,可以为你做这些切换的大部分。 – Brian
http://*.com/questions/5068972/c-atoi-for-wide-chars-on-linux –
应该在链接上解释:wchar_t的使用是否对你的系统有意义取决于你正在使用什么样的编码;对于UTF-8,通常的'strtol()'/'atoi()'可以,但是如果你有多字节/常量大小的字符集,它们不会。 –