将wchar_t转换为int

Las*_*olt 8 c++ wchar-t

我怎么可以转换wchar_t('9')到一个数字中的形式int(9)?

我有以下代码,我检查是否peek是一个数字:

if (iswdigit(peek)) {
    // store peek as numeric
}
Run Code Online (Sandbox Code Playgroud)

我可以减去'0'或者是否有一些我应该担心的Unicode细节?

Dar*_*mas 5

查看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)


Jam*_*nze 5

如果问题只涉及'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)

如果你这样走:

  1. 你肯定想UnicodeData.txt从Unicode联盟下载 文件(" Uncode Character Database " - 这个页面有一个指向Unicode数据文件的链接和它中使用的编码的探索),以及
  2. 可能会写一个这个文件的简单解析器来自动提取信息(例如,当有新版本的Unicode时) - 该文件是为简单的编程解析而设计的.

最后,请注意,基于ostringstreamistringstream(包括boost::lexical_cast)的解决方案将不起作用,因为流中使用的转换被定义为仅使用罗马数字.(另一方面,将代码限制为罗马数字可能是合理的.在这种情况下,测试变为if ( wch >= L'0' && wch <= L'9' ),转换只需减去L'0'- 总是假设编译器中宽字符常量的本机编码是Unicode(我非常肯定,VC++和g ++都是这种情况).或者只是确保语言环境是"C"(或Unix机器上的"Posix").

编辑:我忘了提一下:如果你正在做任何严肃的Unicode编程,你应该看看ICU.正确处理Unicode非常重要,它们已经实现了很多功能.

  • 这取决于您希望了解 Unicode 的程度。C++ 和 Java 正式支持 Unicode,但它们仍然需要数字常量为罗马数字;他们的 Unicode 意识仅限于允许在符号以及字符串和字符文字(和注释)中使用 Unicode 字符。我认为对于很多程序来说,像这样的东西就足够了 Unicode 意识。 (2认同)