CharNext函数返回值是指向字符串中下一个字符的指针,但此函数仅适用于桌面应用程序。
哪个功能可以替代Windows-RT项目?
答案 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;
}