https://github.com/BassLC/idUTF8lib

Idiot's UTF-8 Library

A very (too much really) simple Utf8 library for C++

Usage

#include "lib/idutf8lib.hpp"

Utf8String text; //Empty UTF8 object
Utf8String utf8_text("Héĺĺò Ẃórld"); //std::string compatible constructor
text = "Jello!"; //Supports assignment with std::string AND Utf8String objects
text.to_string(); // == std::string("Jello!") utf8_text.size_in_chars(); // == 11
utf8_text.size_in_bytes(); // == 18 utf8_text[0]; // == std::string("H")
utf8_text.sub_utf8str(1,3); // == Utf8String("éĺĺ")

Features

  • Decodes and parses UTF-8 strings correctly (at least until now)
  • Very lightweight and small: less than 200 newlines total (*without counting tests)

Requirements

  • A C++14 compatible compiler

Notes

Makefile serves only for testing purposes.

Uses the Catch framework for tests.

Thanks

UTF8-CPP

tiny-utf8

#ifndef UTF8_CPP
#define UTF8_CPP #include <string>
#include <vector> class Utf8String { private:
using Utf8Struct = std::vector<std::vector<uint8_t>>; Utf8Struct content; bool is_valid_utf8_string(const std::string &string) const; public:
Utf8String() = default;
Utf8String(const Utf8String &) = default;
Utf8String(Utf8Struct &&content);
Utf8String(const std::string &string);
~Utf8String() = default; std::string to_string() const;
std::size_t size_in_chars() const;
std::size_t size_in_bytes() const;
void clear();
Utf8String sub_utf8str(const std::size_t &initial_pos, const std::size_t &distance = std::string::npos) const; void operator=(const std::string &string);
void operator=(const Utf8String &utf8_structure) noexcept; Utf8String operator+(const Utf8String &utf8_structure) const noexcept;
void operator+=(const Utf8String &utf8_structure) noexcept; std::string operator[](const std::size_t &pos) const; friend std::ostream& operator<<(std::ostream &out, const Utf8String &utf8_structure) noexcept; bool operator==(const Utf8String &utf8_structure) const noexcept;
bool operator==(const std::string &string) const noexcept;
}; #endif
#include "idutf8lib.hpp"
#include <iostream>
#include <bitset>
#include <exception> //* Private functions * bool Utf8String::is_valid_utf8_string(const std::string &string) const {
for ( std::size_t pos = ; pos < string.size(); ++pos ) { //IMPORTANT: The way you access a bitset object is completely backwards.
//EXAMPLE: bitset = 0b10; bitset[0] == 0
std::bitset<> bits = string[pos] >> ; //ASCII character
if ( bits[] == ) {
continue; //Continuation character - should NOT be here
} else if ( bits[] == && bits[] == ){
return false; } else { //Check number of characters
while ( (bits <<= )[] ) {
if ( ++pos >= string.size() ) {
return false;
} if ( std::bitset<>(string[pos] >> ) != 0b10 ) {
return false;
}
}
}
} return true;
} //* Constructors * Utf8String::Utf8String(const std::string &string) {
std::vector<uint8_t> utf8_char; if ( !is_valid_utf8_string(string) ) {
throw(std::runtime_error("Invalid UTF8 String in constructor"));
} for ( const auto &chr : string ) {
std::bitset<> start_bits = (chr >> ); if ( start_bits[] == ) { //ASCII character is pushed after making sure of the character before
if ( !utf8_char.empty() ) {
content.push_back(utf8_char);
utf8_char.clear();
} content.push_back(std::vector<uint8_t>(, chr));
continue; //If there's more than one byte
} else if ( start_bits == 0b11 ) { //Check to see if it has to flush the last character
if ( !utf8_char.empty() ) {
content.push_back(utf8_char);
utf8_char.clear();
}
} utf8_char.push_back(chr);
} //If last character is non-ASCII
if ( !utf8_char.empty() ) {
content.push_back(utf8_char);
}
} Utf8String::Utf8String(Utf8Struct &&temp) {
content = temp;
} //* Public Interface * std::string Utf8String::to_string() const {
std::string temp; for ( const auto &chr : content ) {
temp += std::string(chr.begin(), chr.end());
} return temp;
} std::size_t Utf8String::size_in_chars() const { return content.size(); } std::size_t Utf8String::size_in_bytes() const {
std::size_t size = ; for ( const auto &chr : content ) {
size += chr.size();
} return size;
} void Utf8String::clear() { content.clear(); } Utf8String Utf8String::sub_utf8str(const std::size_t &initial_pos, const std::size_t &distance) const { const std::size_t end_pos = (distance == std::string::npos) ? content.size() : (initial_pos + distance); // To be sure we don't try to overflow
if ( initial_pos >= content.size() || end_pos > content.size() ){
throw std::out_of_range("Too big substr access");
} return Utf8String(Utf8Struct(content.begin()+initial_pos, content.begin()+end_pos));
} //* Operators * void Utf8String::operator=(const std::string &string) {
Utf8String temp(string);
content = temp.content;
} void Utf8String::operator=(const Utf8String &utf8_object) noexcept { content = utf8_object.content; } std::string Utf8String::operator[](const std::size_t &pos) const {
if ( pos >= content.size() ) {
throw std::out_of_range("Bad UTF-8 range access with []");
} return std::string(content[pos].begin(), content[pos].end());
} Utf8String Utf8String::operator+(const Utf8String &utf8_structure) const noexcept {
Utf8Struct temp = content;
temp.insert(std::end(temp), std::begin(utf8_structure.content), std::end(utf8_structure.content));
return Utf8String(std::move(temp));
} void Utf8String::operator+=(const Utf8String &utf8_structure) noexcept {
content.insert(std::end(content), std::begin(utf8_structure.content), std::end(utf8_structure.content));
} std::ostream& operator<<(std::ostream &out, const Utf8String &utf8_structure) noexcept{
out << utf8_structure.to_string();
return out;
} bool Utf8String::operator==(const Utf8String &utf8_structure) const noexcept {
return (content == utf8_structure.content);
} bool Utf8String::operator==(const std::string &string) const noexcept {
return (this->to_string() == string);
}

utf8 string的更多相关文章

  1. java.lang.ClassFormatError: Illegal UTF8 string in constant pool in class file Server/Request

    Linux服务器上,将本地编译好的文件上传后,Tomcat启动时报错: Exception in thread "Thread-2" java.lang.ClassFormatEr ...

  2. C++Builder RAD Studio XE, UTF-8 String 转换为 char * 字符串的最简单方式, 常用于sqlite3开发

    前段时间突然使用sqlite3开发,中间需要用中文,XE的缺省char*直接使用中文,在sqlite *.db3的数据库表格中显示是乱码,用数据库管理器来浏览等管理时非常不便. 于是决定还是使用utf ...

  3. SOAP-ERROR: Encoding: string … is not a valid utf-8 string

    今天遇到一个错误,看标题就知道是什么错误了.... 最坑爹的是,不是所有的用户会报这个错误.只有少部分.在生产环境又没办法调试. 找了半天都不知道什么原因,字面意思大概是需要一个utf8编码的字符串, ...

  4. 在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编

    在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...

  5. QString,string,char* 在utf8和gbk不同编码下的相互转化

    关于编码简介:ascii编码是最开始的编码规则本,里面只收纳了英文.特殊字符.数字等有限字符,采用的是8位一个字节的方式进行编码对照:unicode在ascii码的基础上进行了升级扩展,立志将全世界所 ...

  6. new String(getBytes(ISO-8859-1),UTF-8)中文编码避免乱码

    byte[] b_gbk = "深".getBytes("GBK"); byte[] b_utf8 = "深".getBytes(" ...

  7. 构造UTF8的std::string

    在VC++的世界里,MS比较鼓励使用_UNICODE,std::wstring.而在Web, XML则提倡用UTF8.当在C++的程序里要保存/读取XML数据,就存在wstring与string之间的 ...

  8. Java读带有BOM的UTF-8文件乱码原因及解决方法

    原因: 关于utf-8编码的txt文件,windows以记事本方式保存时会在第一行最开始处自动加入bom格式的相关信息,大概三个字节! 所以java在读取此类文件时第一行时会多出三个不相关的字节,这样 ...

  9. XML编码utf-8有中文无法解析或乱码 C#

    XML的encoding="UTF-8" ,含有中文的话(部分)会出现乱码. 网上还是很多这类问题跟解决办法的. 表现为用ie或者infopath之类的xml软件打不开这个xml, ...

随机推荐

  1. dell台式机设置U盘启动步骤

    在开机启动看见DELL的标志后,连续按F12键进入BIOS界面,然后按照界面进行操作,操做完成后保存退出,然后再按F12键选择U盘启动. 注意硬盘模式需要选择为disabled.

  2. Spark任务调度

    不多说,直接上干货! Spark任务调度 DAGScheduler 构建Stage—碰到shuffle就split 记录哪个RDD 或者Stage 输出被物化 重新提交shuffle 输出丢失的sta ...

  3. canvas制作刮刮乐案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. WebApp开发技巧大全

    1.开发成本较低使用web开发技术就可以轻松的完成web app的开发 2.升级较简单升级不需要通知用户,在服务端更新文件即可,用户完全没有感觉 3.维护比较轻松和一般的web一样,维护比较简单,它其 ...

  5. Kattis -Backspace

    Backspace Bjarki having trouble Shortly before the programming contest started, Bjarki decided to up ...

  6. 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统

    一.前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 代码已经放到github上了,地址:https://github.com/larger5/s ...

  7. luoguP5055 【模板】可持久化文艺平衡树 可持久化非旋转treap

    好题. Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in&quo ...

  8. vue 移动端项目,动态控制div距离底部的距离

    <template> <div class="details"> <com-nav-bar title="保险详情"> &l ...

  9. [USACO 2009 Feb Gold] Fair Shuttle (贪心+优先队列)

    题目大意:有N个站点的轻轨站,有一个容量为C的列车起点在1号站点,终点在N号站点,有K组牛群,每组数量为Mi(1≤Mi≤N),行程起点和终点分别为Si和Ei(1≤Si<Ei≤N).计算最多有多少 ...

  10. Matplotlib 绘图与可视化 一些属性和错误

    属性 *)调整图像边缘及图像间的空白间隔plt.subplots.adjust(6个参数) 图像外部边缘的调整可以使用plt.tight_layout()进行自动控制,此方法不能够很好的控制图像间的间 ...