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,有些童鞋在没 ...
随机推荐
- 关于logrotate工具的日志切割
logrotate是一个非常好的文件切割工具!! 具体配置如下: /var/log/debug.log{ daily ; 每天转储 rotate ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_元数据
1.元数据简介 全称:metadata 属性:数据表集合 产地:面向 CLR 的编译器在托管模块中生成 2.元数据内部结构及与托管模块的关系 [概述] 托管模块中包含着元数据,元数据是由一组数据表组成 ...
- poj3349找相同的雪花(哈希)
题目传送门 题目大意:给你n个雪花,每个雪花的六个棱都有各自的长度,如果存在两片雪花的每条棱长度对应相同,则输出一句英文,如果不存在就输出另外一句英文,n和长度都比较大. 思路:第一次真正接触哈希,查 ...
- 江西财经大学第一届程序设计竞赛 C
链接:https://www.nowcoder.com/acm/contest/115/C来源:牛客网 题目描述 决赛圈还剩下两个人,“伏地魔”XDD和跑毒进圈的FZL,XDD拿着狙击枪AWM瞄准并准 ...
- git学习中遇到的疑难杂症
GIT仓库如何恢复到前一次提交 一.通过使用Git版本恢复命令reset,可以回退版本 reset命令有3种方式: 1.git reset –mixed:此为默认方式,不带任何参数的git r ...
- django ORM 连表查询2
set() 更新model对象的关联对象 book_obj=models.Book.objects.first() book_obj.authors.set([2,3]) 把book_obj这个对象重 ...
- asp.net mvc AjaxHelper 获取 JSON 的方法
默认的 AjaxHelper 没有提供获取 JSON 的方法,只提供获取 html 然后更新指定元素的方法,不过,经测试发现还是有办法的,由于 AjaxOptions 对象的 OnSuccess 属性 ...
- python3 + pycharm+requests+HTMLTestRunner接口自动化测试步骤
1.python3 环境的搭建,pycharm安装 2.想要用requests做自动化接口测试,那么就得先安装requests这个第三方库,在命令窗口执行 pip install requests 3 ...
- PHP、thinkPHP5.0开发网站文件管理功能(四)下载文件
public function download($currdir = null){ $file = urldecode($currdir); $file = iconv('UTF-8', " ...
- 07-----nodejs 中 npm的使用
npm是什么? 简单的说,npm就是JavaScript的包管理工具.类似Java语法中的maven,gradle,python中的pip. 安装 傻瓜式的安装. 第一步:打开https://node ...