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 转换函数,它将识别多字节字符,以及 将它们转换为单个元素. 对于偶尔使用或更短的序列,可以自己编写 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 ; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |