C子串多字节字符

C子串多字节字符,第1张

概述我有这个std :: string,其中包含一些跨越多个字节的字符. 当我对此字符串执行子字符串时,输出无效,因为当然,这些字符计为2个字符.在我看来,我应该使用wstring,因为它将这些字符存储为一个元素而不是更多. 所以我决定将字符串复制到wstring中,但是当然这没有意义,因为字符仍然分为2个字符.这只会让情况变得更糟. 将字符串转换为wstring有一个很好的解决方案,将特殊字符合并为 我有这个std :: string,其中包含一些跨越多个字节的字符.

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

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

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

谢谢

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

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

inline size_tsize(    Byte                ch ){    return byteCounttable[ ch ] ;}template< typename inputIterator >inputIteratorsucc(    inputIterator       begin,size_t              size,std::random_access_iterator_tag ){    return begin + size ;}template< typename inputIterator >inputIteratorsucc(    inputIterator       begin,std::input_iterator_tag ){    while ( size != 0 ) {        ++ begin ;        -- size ;    }    return begin ;}template< typename inputIterator >inputIteratorsucc(    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_tcharacterCount(    inputIterator       begin,inputIterator       end ){    size_t              result = 0 ;    while ( begin != end ) {        ++ result ;        begin = succ( begin,end ) ;    }    return result ;}
总结

以上是内存溢出为你收集整理的C子串多字节字符全部内容,希望文章能够帮你解决C子串多字节字符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1220840.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存