c++ 处理utf-8字符串
c++的字符串中的每一个元素都是一个字节。所以在装入utf8字符串的时候,其实是按照一定的规则编码的。
字符的8位中 如果0开头 则自己就是一个单位。
1字节 | 0xxxxxxx |
2字节 | 110xxxxx 10xxxxxx |
3字节 | 1110xxxx 10xxxxxx 10xxxxxx |
4字节 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
5字节 | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
6字节 | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
所以知道这个就好办了。这里有一个类,用来专门处理utf-8的字符串,实现了字符串截取,索引,长度等功能~
#ifndef __IUTF8_STRING__ #define __IUTF8_STRING__ class iutf8string { public: iutf8string(const std::string& ); iutf8string(const char* ); ~iutf8string(); public: int length(); std::string substring(int start_index, int length); std::string get(int index); iutf8string operator + (iutf8string& ); std::string operator [](int index); std::string stlstring(); const char* c_str(); iutf8string utf8substr(int u8start_index, int u8_length); std::string substr(int u8start_index, int u8_length); private: std::string data; int* offerset; int _length; void refresh(); }; #endif
#include <iostream> #include <string> #include "iutf8string.h" using namespace std; iutf8string::iutf8string(const string& str) { data = str; refresh(); } iutf8string::iutf8string(const char* str) { data = string(str); refresh(); } iutf8string::~iutf8string() { delete[] offerset; } string iutf8string::stlstring() { return data; } const char* iutf8string::c_str() { return data.c_str(); } iutf8string iutf8string::operator +(iutf8string& ustr) { string temp = data + ustr.stlstring(); return iutf8string(temp); } int iutf8string::length() { return _length; } string iutf8string::get(int index) { if(index >= _length) return ""; ] - offerset[index]); return temp; } string iutf8string::operator [](int index) { if(index >= _length) return ""; ] - offerset[index]); return temp; } string iutf8string::substr(int u8_start_index, int u8_length) { if(u8_start_index + u8_length >= _length) return ""; return data.substr(offerset[u8_start_index], offerset[u8_start_index+u8_length] - offerset[u8_start_index]); } iutf8string iutf8string::utf8substr(int u8_start_index, int u8_length) { if(u8_start_index + u8_length >= _length) return iutf8string(""); string ret = data.substr(offerset[u8_start_index], offerset[u8_start_index+u8_length] - offerset[u8_start_index]); return iutf8string(ret); } void iutf8string::refresh() { int *tmp = new int[data.length()]; ; ; i < data.length(); i++) { )||(!((())) { tmp[tmpidx] = i; tmpidx++; } } tmp[tmpidx] = data.length(); int *tmp2 = new int[tmpidx]; ; i < tmpidx; i++) { tmp2[i] = tmp[i]; } delete[] tmp; offerset = tmp2; _length = tmpidx; } //----------------test code ---------------------------- int main() { iutf8string str1("_我Love你!中国 ,!"); cout << "字符串长度:" <<str1.length() <<endl; int i; cout << "[" ; ; i < str1.length(); i++) { cout << str1[i] << " "; } cout << "]" << endl; ,); cout << one << endl; string s1("我们都是好孩子!"); iutf8string str2(s1); cout << "[" ; ; i < str2.length(); i++) { cout << str2[i] << " "; } cout << "]" << endl; }
最后祝您,提乾涉经。告辞。
c++ 处理utf-8字符串的更多相关文章
- 聊聊Node.js 独立日漏洞
背景 Node.js 社区近期在美国独立日周末的狂欢之时爆出漏洞 https://medium.com/@iojs/important-security-upgrades-for-node-js-an ...
- Python基础2 编码和逻辑运算符
编码: AscII码 :标准ASCII码是采用7位二进制码来编码的,当用1个字节(8位二进制码)来表示ASCII码时,就在最高位添加1个0. 一个英文字母占一个字节 8位(bit)==一个字节(byt ...
- python基础(三)编码,深浅copy
编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...
- 廖雪峰Python3笔记
主要复习过一遍 简介 略 安装 略 *** 第一个Python程序 第一行的注释: # _*_ coding: utf-8 _*_ #!/usr/bin/env python3 print() 可以接 ...
- Python基础2 字符编码和逻辑运算符
编码 AscII码 :标准ASCII码是采用7位二进制码来编码的,最高为0,没有0000 0000,所以就是2**7-1=127个字符 , 当用1个字节(8位二进制码)来表示ASCII码时,就在最高位 ...
- Python小白学习之路(十六)—【内置函数一】
将68个内置函数按照其功能分为了10类,分别是: 数学运算(7个) abs() divmod() max() min() pow() round() sum() 类型转换(24个) bo ...
- Java中I/O流之数据流
Java 中的数据流: 对于某问题:将一个 long 类型的数据写到文件中,有办法吗? 转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. ...
- java 聊天程序
package cn.apr.chart; import java.net.*; import java.io.*; import java.util.*; public class ChatServ ...
- python3.7 文件操作
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 文件操作 # r 只读,默认打开方式,当文件不存在时会报错 # ...
- JNI教程与技术手册
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52806794 本文出自: [HansChen的博客] 概述 对于JNI,有些童鞋在没 ...
随机推荐
- 树链剖分【洛谷P2590】 [ZJOI2008]树的统计
P2590 [ZJOI2008]树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把 ...
- linux网络编程中的基本概念
int close(int fd)(假设是服务器端) close 关闭了自身数据传输的两个方向.close一个TCP套接字的默认行为是把该套接字标记成已关闭,然后立即返回到调用进程.该套接字描述符不能 ...
- HiBench学习笔记
HiBench资源及教程:https://github.com/intel-hadoop/HiBench 介绍: Hadoop新人 环境 linux 该笔记针对英语弱鸡&自己在使用过程用遇到的 ...
- 牛客寒假算法基础集训营5 J 炫酷数学
链接:https://ac.nowcoder.com/acm/contest/331/J来源:牛客网 小希最近想知道一个东西,就是A+B=A|B(其中|为按位或)的二元组有多少个. 当然,直接做这个式 ...
- powershell和cmd区别
Powershell是cmd的超集,换句话说,cmd能做的事情,Powershell都能做,但是Powershell还能额外做许多cmd不能做的活. 主要是系统管理功能.脚本语言和在线帮助更强大,你确 ...
- ScheduledThreadPoolDemo01
package com.zhy.concurrency.timer; import java.util.Date; import java.util.Timer; import java.util.T ...
- ajaxfileupload.js异步上传
转载:https://www.cnblogs.com/labimeilexin/p/6742647.html jQuery插件之ajaxFileUpload ajaxFileUpload.js ...
- SecureCRT 遇到一个致命的错误且必须关闭
1.将报错路径中VanDyke文件夹内的东西删除掉2.运行regedit,在注册表中将HKEY_LOCAL_MACHINA中SOFTWARE里的VanDyke删除3.注册表中打开HKEY_CURREN ...
- nginx 资源重定向
背景:有时候我一些资源(.js .css etc.)等不想访问我本地的,我想重定向到其他 URL 解决:直接修改 nginx 的配置文件 conf,添加下面的代码 #avoid processing ...
- perf命令
@(Linux基础)[perf命令] perf命令 ---- 简介 Perf是内置于Linux内核源码树中的性能剖析(profiling)工具,它基于事件采样原理,以性能事件为基础,支持针对处理器相关 ...