WinRT API中的CharNext(..)模拟

时间:2014-02-05 06:02:59

标签: c# windows-runtime

来自WinAPI的

CharNext函数返回值是指向字符串中下一个字符的指针,但此函数仅适用于桌面应用程序。

哪个功能可以替代Windows-RT项目?

2 个答案:

答案 0 :(得分:1)

如果需要,可以很容易地实现一个(下面未经测试的代码):

inline bool isCombiningCharacter( wchar_t c )
{
    // http://en.wikipedia.org/wiki/Combining_character#Unicode_ranges
    if( c <  0x0300 ) return false;
    if( c <= 0x036F ) return true;
    if( c <  0x1DC0 ) return false;
    if( c <= 0x1DFF ) return true;
    if( c <  0x20D0 ) return false;
    if( c <= 0x20FF ) return true;
    if( c <  0xFE20 ) return false;
    if( c <= 0xFE2F ) return true;
    return false;
}

wchar_t* CharNext( wchar_t* lpsz )
{
    if( NULL == lpsz || 0 == *lpsz ) return lpsz;
    while( true )
    {
        lpsz++;
        const wchar_t nextChar = *lpsz;
        if( !isCombiningCharacter( nextChar ) || 0 == nextChar )
            return lpsz;
    }
}

更新:我的示例代码用于UCS-2编码。如果您需要支持UTF16,则必须添加对代理项对的支持。引导代理值为0xD800 ... 0xDBFF,尾代理为0xDC00 ... 0xDFFF,如果在字符串中遇到引导代理并且后跟尾代理 - 则必须跳过这两者,因为它们都是单个Unicode字符,代码点&gt; = 0x10000 ,然后跳过组合后面的字符。

答案 1 :(得分:0)

我相信使用Windows.Data.Text.UnicodeCharacters.IsGraphemeBase可以帮助您实现Unicode's Default Grapheme Cluster Boundary Specification的大部分工作。

类似的东西:

    int NextGraphemeIndex(string s, int index)
    {
        for (++index; index != s.Length; ++index)
        {
            uint ch = s[index];
            int characterEndIndex = index;
            if (Windows.Data.Text.UnicodeCharacters.IsHighSurrogate(ch))
            {
                ++characterEndIndex;
                ch = Windows.Data.Text.UnicodeCharacters.GetCodepointFromSurrogatePair(ch, s[characterEndIndex]);
            }
            if (Windows.Data.Text.UnicodeCharacters.IsGraphemeBase(ch))
            {
                break;
            }
            index = characterEndIndex;
        }
        return index;
    }