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,有些童鞋在没 ...
随机推荐
- springmvc htmlEscape标签的作用
有些东西自己不知道就想要弄明白 唉 做项目 看人家项目中用到啦 不会 不知道 就百度啦 整理了一下 方便自己记忆 一.SpringMVC 表单元素标签 如下: <form:textarea ...
- linode出现以下报错
Linode Manager 报错 系统重新安装后 解决办法执行 rm -rf ~/.ssh/known_hosts 再继续执行:ssh root@72.14.189.163
- Gym - 101615J Grid Coloring DP 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)
题目传送门 题目大意: 给出n*m的网格,有红蓝两种颜色,每个格子都必须被染色,当一个格子被染成蓝色后,这个格子左上方的一块都必须被染成蓝色,问最后的方案数量. 思路: 按照题目条件,如果有一个格子被 ...
- lintcode - 恢复ip地址
class Solution { public: /* * @param s: the IP string * @return: All possible valid IP addresses */ ...
- PS常用快捷键大全
察看图像类别 说明:: --- Shift键 : --- 空格键 *--- 在Imageready中不适用 § --- 只在Imageready中可用 动作 结果 双击工具箱::或Ct ...
- linux学习3(vim)
一.文档编辑 1. vi和vim命令 Vim的打开文件的方式(4种,要求掌握的就前三种): 1. vim 文件路径 ...
- BeautifulSoup4模块的使用
1. 安装 pip3 install beautifulsoup42. 使用 from bs4 import BeautifulSoup obj = BeautifulSoup("HTML内 ...
- 1.Ioc&DI和Spring
1.面向对象回顾和案例 面向对象程序设计:1 2 3 4 案例分析: 需求分析: 报表功能: 报表服务类,检索数据,并生成图标 报表生成器类,生成不同格式的报表文件,例如PDF格式.H ...
- bootstrap多选框
不多说,先上图片 本多选框是用的bootstrap的样式为基础,将弹出框css改造,然后自己写的js得到. 下面为全部页面的代码,需要的可以自己改动js,得到自己需要的效果 <!DOCTYPE ...
- 懒汉式单例要加volatile吗
private static volatile Something instance = null; public static Something getInstance() { if (insta ...