我怎么可以转换wchar_t('9')到一个数字中的形式int(9)?
我有以下代码,我检查是否peek是一个数字:
if (iswdigit(peek)) {
// store peek as numeric
}
Run Code Online (Sandbox Code Playgroud)
我可以减去'0'或者是否有一些我应该担心的Unicode细节?
查看atoi函数类:http://msdn.microsoft.com/en-us/library/hc25t012(v = vs.71).aspx
特别_wtoi(const wchar_t *string);是你正在寻找的东西.但是,您必须确保wchar_t正确的null终止,所以尝试这样的事情:
if (iswdigit(peek)) {
// store peek as numeric
wchar_t s[2];
s[0] = peek;
s[1] = 0;
int numeric_peek = _wtoi(s);
}
Run Code Online (Sandbox Code Playgroud)
如果问题只涉及'9'(或其中一个罗马数字),只需减去'0'正确的解决方案.但是,如果您担心iswdigit返回非零的任何事情,则问题可能会复杂得多.标准表示iswdigit如果其参数为"十进制数字宽字符代码[在当前本地]" ,则返回非零值.这是模糊的,并将其留给语言环境来准确定义其含义.在"C"语言环境或"Posix"语言环境中,"Posix"标准至少保证只有罗马数字0到9被认为是十进制数字(如果我理解正确的话),所以如果你在"C"或"Posix"语言环境,只需减去"0"即可.
据推测,在Unicode语言环境中,这将是具有常规类别的任何字符Nd.有很多这些.最安全的解决方案就是创建类似(带有静态生命周期的变量)的东西:
wchar_t const* const digitTables[] =
{
L"0123456789",
L"\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
// ...
};
//! \return
//! wch as a numeric digit, or -1 if it is not a digit
int asNumeric( wchar_t wch )
{
int result = -1;
for ( wchar_t const* const* p = std::begin( digitTables );
p != std::end( digitTables ) && result == -1;
++ p ) {
wchar_t const* q = std::find( *p, *p + 10, wch );
if ( q != *p + 10 ) {
result = q - *p;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果你这样走:
UnicodeData.txt从Unicode联盟下载
文件(" Uncode Character Database " - 这个页面有一个指向Unicode数据文件的链接和它中使用的编码的探索),以及最后,请注意,基于ostringstream和
istringstream(包括boost::lexical_cast)的解决方案将不起作用,因为流中使用的转换被定义为仅使用罗马数字.(另一方面,将代码限制为罗马数字可能是合理的.在这种情况下,测试变为if ( wch >= L'0' && wch <= L'9' ),转换只需减去L'0'- 总是假设编译器中宽字符常量的本机编码是Unicode(我非常肯定,VC++和g ++都是这种情况).或者只是确保语言环境是"C"(或Unix机器上的"Posix").
编辑:我忘了提一下:如果你正在做任何严肃的Unicode编程,你应该看看ICU.正确处理Unicode非常重要,它们已经实现了很多功能.
| 归档时间: |
|
| 查看次数: |
24931 次 |
| 最近记录: |