加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C子串多字节字符

发布时间:2020-12-16 10:31:33 所属栏目:百科 来源:网络整理
导读:我有这个std :: string,其中包含一些跨越多个字节的字符. 当我对此字符串执行子字符串时,输出无效,因为当然,这些字符计为2个字符.在我看来,我应该使用wstring,因为它将这些字符存储为一个元素而不是更多. 所以我决定将字符串复制到wstring中,但是当然这没有
我有这个std :: string,其中包含一些跨越多个字节的字符.

当我对此字符串执行子字符串时,输出无效,因为当然,这些字符计为2个字符.在我看来,我应该使用wstring,因为它将这些字符存储为一个元素而不是更多.

所以我决定将字符串复制到wstring中,但是当然这没有意义,因为字符仍然分为2个字符.这只会让情况变得更糟.

将字符串转换为wstring有一个很好的解决方案,将特殊字符合并为1个元素而不是2个元素.

谢谢

解决方法

实际上只有两种可能的解决方案.如果你这样做了
很多,在很远的距离,你最好转换你的
字符到单个元素编码,使用wchar_t(或int32_t,
或者什么是最合适的.这不是一个简单的副本
将每个char转换为目标类型,但是为true
转换函数,它将识别多字节字符,以及
将它们转换为单个元素.

对于偶尔使用或更短的序列,可以自己编写
用于提前n个字节的函数.对于UTF-8,我使用以下内容:

inline size_t
size(
    Byte                ch )
{
    return byteCountTable[ ch ] ;
}

template< typename InputIterator >
InputIterator
succ(
    InputIterator       begin,size_t              size,std::random_access_iterator_tag )
{
    return begin + size ;
}

template< typename InputIterator >
InputIterator
succ(
    InputIterator       begin,std::input_iterator_tag )
{
    while ( size != 0 ) {
        ++ begin ;
        -- size ;
    }
    return begin ;
}

template< typename InputIterator >
InputIterator
succ(
    InputIterator       begin,InputIterator       end )
{
    if ( begin != end ) {
        begin = succ( begin,end,size( *begin ),std::::iterator_traits< InputIterator >::iterator_category() ) ;
    }
    return begin ;
}

template< typename InputIterator >
size_t
characterCount(
    InputIterator       begin,InputIterator       end )
{
    size_t              result = 0 ;
    while ( begin != end ) {
        ++ result ;
        begin = succ( begin,end ) ;
    }
    return result ;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读