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. BZOJ 2287 DP+容斥

    思路: 先处理出来f[j]表示这i个物品都可用 填满容量j的方案数 容斥一发 处理出来g[j]=g[j-w[i]] 表示i不能用的时候 填满容量j的方案数 //By SiriusRen #includ ...

  2. 手机、电脑、安卓、iOS、微信浏览器判断

    微信浏览器判断: // true为微信浏览器function is_weixin() { var ua = window.navigator.userAgent.toLowerCase(); if ( ...

  3. Haskell手撸Softmax回归实现MNIST手写识别

    Haskell手撸Softmax回归实现MNIST手写识别 前言 初学Haskell,看的书是Learn You a Haskell for Great Good, 才刚看到Making Our Ow ...

  4. DDD中Dto领域驱动设计概述,摘自《NET企业级应用架构设计》

  5. JS判断客户端是否是iOS或者Android或者ipad(三)

     *  * @function: 判断浏览器类型是否是Safari.Firefox.ie.chrome浏览器  * @return: true或false  *  */ function isSafa ...

  6. Java中使用MD5加密的简单实现

    import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorith ...

  7. Codeforces Round #468 (Div. 2 )D. Peculiar apple-tree_BFS

    题目简单,不多解释. Code: #include<cstdio> #include<queue> using namespace std; const int maxn = ...

  8. 《Let's Build A Simple Interpreter》之 Golang 版

    一直以来对编译器/解释器等都较有兴趣.我非科班出身,当初还在大学时,只是马马虎虎看完了<编译原理>之类教材,上机非常少,对龙书之类圣经也只是浅尝辄止而已.工作至今,基本已将编译原理相关知识 ...

  9. python之类与对象属性的增删改查

    类属性与对象属性的增删改查 类属性的增删改查 class School: """ 文档 """ Teacher = "老王&quo ...

  10. vue2 在methods 中无法获取this对象

    在methods中使用箭头函数无法获取this ExamName:()=> { console.log(this);} 这样就行了: ExamName:function() { console. ...