当前位置: 首页 > 编程日记 > 正文

UTF-8 CPP的使用

UTF-8 CPP是一个简单、小巧、轻量级、跨平台的UTF-8编码字符串库。

下面对其使用方法进行简单的介绍:

1.      从http://sourceforge.net/projects/utfcpp/下载最新的utf8_v2_3_4.zip源码,将其解压缩;

2.      新建一个vs2013 控制台工程TestUTF-8CPP,将utf-8cpp中的src文件加入到包含目录中;

3.      参考http://utfcpp.sourceforge.net/,测试代码内容为:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <assert.h>
#include "utf8.h"// checks whether the content of a file is valid UTF-8 encoded text without reading the content into the memory
bool valid_utf8_file(const char* file_name)
{std::ifstream ifs(file_name);if (!ifs)return false; // even better, throw herestd::istreambuf_iterator<char> it(ifs.rdbuf());std::istreambuf_iterator<char> eos;return utf8::is_valid(it, eos);
}// The function will replace any invalid UTF-8 sequence with a Unicode replacement character
void fix_utf8_string(std::string& str)
{std::string temp;utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));str = temp;
}int main(int argc, char* argv[])
{const char* test_file_path = "../../../demo/test.txt";// Open the test file(contains UTF-8 encoded text)std::ifstream fs8(test_file_path);if (!fs8.is_open()) {std::cout << "Could not open " << test_file_path << std::endl;return -1;}if (!valid_utf8_file(test_file_path))return -1;unsigned line_count = 1;std::string line;// Play with all the lines in the filewhile (getline(fs8, line)) {// check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function)std::string::iterator end_it = utf8::find_invalid(line.begin(), line.end());if (end_it != line.end()) {std::cout << "Invalid UTF-8 encoding detected at line " << line_count << "\n";std::cout << "This part is fine: " << std::string(line.begin(), end_it) << "\n";}// Get the line length (at least for the valid part)int length = utf8::distance(line.begin(), end_it);std::cout << "Length of line " << line_count << " is " << length << "\n";// Convert it to utf-16std::vector<unsigned short> utf16line;utf8::utf8to16(line.begin(), end_it, back_inserter(utf16line));// And back to utf-8std::string utf8line;utf8::utf16to8(utf16line.begin(), utf16line.end(), back_inserter(utf8line));// Confirm that the conversion went OK:if (utf8line != std::string(line.begin(), end_it))std::cout << "Error in UTF-16 conversion at line: " << line_count << "\n";line_count++;}std::string str = "ABCD";std::vector<unsigned short> utf16result;utf8::utf8to16(str.begin(), str.end(), std::back_inserter(utf16result));size_t size1 = utf16result.size();std::string str2 = "濦粿夿旴";std::string utf8str;utf8::utf16to8(str2.begin(), str2.end(), std::back_inserter(utf8str));size_t size2 = utf8str.length();char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e";std::vector <unsigned short> utf16result1;utf8::utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result1));assert(utf16result1.size() == 4);assert(utf16result1[2] == 0xd834);assert(utf16result1[3] == 0xdd1e);unsigned short utf16string[] = { 0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e };std::vector<unsigned char> utf8result;utf8::utf16to8(utf16string, utf16string + 5, back_inserter(utf8result));assert(utf8result.size() == 10);char* szSex = "\xe7\x94\xb7\x00";std::basic_string<wchar_t> sex;utf8::utf8to16(szSex, szSex + strlen(szSex), back_inserter(sex));if (sex != L"男") {std::cout << "unicode char utf16 error" << std::endl;return -1;}std::cout << "ok!" << std::endl;return 0;
}

GitHub:https://github.com/fengbingchun/UTF-8CPP_Test

相关文章:

一行js代码识别Selenium+Webdriver及其应对方案

有不少朋友在开发爬虫的过程中喜欢使用Selenium Chromedriver&#xff0c;以为这样就能做到不被网站的反爬虫机制发现。 先不说淘宝这种基于用户行为的反爬虫策略&#xff0c;仅仅是一个普通的小网站&#xff0c;使用一行Javascript代码&#xff0c;就能轻轻松松识别你是否使用…

Android系统移植与调试之-------如何修改Android设备添加重启、飞行模式、静音模式等功能(一)...

1、首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面 具体的修改内容在下一篇中具体介绍。 Android系统移植与调试之------->如何修改Android设备添加重启、飞行模式、静音模式等功能&#xff08;二&#xff09; 作者&#xff1a;欧阳鹏 欢迎转载&#xf…

鸿蒙霸榜GitHub,从最初的Plan B到“取代Android”?

整理 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;距离 8 月 9 日鸿蒙&#xff08;HarmonyOS&#xff09;正式发布刚刚过去九天&#xff0c;这场由华为领衔的技术风暴&#xff0c;经过十年蛰伏&#xff0c;终于成功引爆全球。与此同时&#xff0c;一个非官…

CODING 最佳实践:快课网研发效能提升之路

快课企业移动学习平台是上海快微网络科技有限公司自主研发的企业级 SaaS 平台&#xff0c;提供移动学习、考试练习、培训管理、知识分享、统计分析等学习和培训功能&#xff0c;为员工、经销商及客户等全价值链合作伙伴提供全面的知识服务。本文将详细介绍快课网的研发团队是如…

基于chyh1990/caffe-compact在windows vs2013上编译caffe步骤

1. 从https://github.com/chyh1990/caffe-compact下载caffe-compact代码&#xff1b; 2. 通过CMake(cmake-gui)生成vs2013 x64 caffe工程&#xff1b; 3. 从https://github.com/google/protobuf下载ProtoBuf&#xff0c;解压缩&#xff0c;编译ProtoBuf&#xf…

菜鸟学***——菜鸟的旅程

第一章&#xff0e;菜鸟的旅程作为一个典型的菜鸟&#xff0c;第一次去网吧上网我不知道怎么开机是很正常的事情&#xff0c;但是无论怎么菜怎么无知也无法阻止我对于***的崇拜&#xff0c;我喜欢他们的那种神秘和在我们普通人眼中的无所不能&#xff0c;在网络世界里他们就想鱼…

程序员假冒AI,印度公司竟骗取2亿元投资

作者 | 神经小姐姐来源 | HyperAI超神经&#xff08;ID&#xff1a;HyperAI&#xff09;人工智能界有句调侃的话——「有多少智能&#xff0c;就有多少人工」&#xff0c;今天&#xff0c;印度的一家人工智能公司就印证了这句话。据《华尔街日报》报道&#xff0c;印度创业公司…

Windows7上使用VS2013编译Caffe源码(不带GPU支持)步骤

1. 从https://github.com/BVLC/caffe/通过git clone下载caffe源码,master分支,版本号为09868ac&#xff1a;$ git clone https://github.com/BVLC/caffe.git &#xff1b;2. 先使用cmake-gui构建生成vs2013工程&#xff0c;发现有很多错误&#xff0c;提示缺少各种依…

区块链之比特币的潜在激励

想知道更多区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】链客&#xff0c;有问必答&#xff01;&#xff01; 比特币&#xff0c;这个建立在开放P2P&#xff08;点对点&#xff09;网络结构之上的货币&#xff08;文献9&#xff09;&#xff0c;继续享受人们的追…

每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;随着深度学习、强化学习、知识图谱、AutoML 等 AI 技术出现更多突破&#xff0c;推荐系统领域的企业和开发者开始将这些技术与传统推荐算法相结合&#xff0c;使得推荐效果得到显著提升。不过&#xff0c;越…

常用的JQuery数字类型验证正则表达式

var regexEnum { intege:"^-?[1-9]//d*$", //整数 intege1:"^[1-9]//d*$", //正整数 intege2:"^-[1-9]//d*$", //负整数 num:"^([-]?)//d*//.?//d$", //数字 num1:"^([1-9]//d*|0)$", //正数&#xff…

Java多线程编程实战:模拟大量数据同步

背景 最近对于 Java 多线程做了一段时间的学习&#xff0c;笔者一直认为&#xff0c;学习东西就是要应用到实际的业务需求中的。否则要么无法深入理解&#xff0c;要么硬生生地套用技术只是达到炫技的效果。 不过笔者仍旧认为自己对于多线程掌握不够熟练&#xff0c;不敢轻易应…

Ubuntu中Atom编辑器显示中文乱码的处理方法

在Ubuntu14.04 64位机上安装Atom&#xff0c;依次在终端输入如下命令&#xff1a; 1. $ sudo add-apt-repository ppa:webupd8team/atom 2. $ sudo apt-get update 3. $ sudo apt-get install atom处理中文乱码的问题&#xff1a; 1. 安装文泉驿正黑等相关中文字体&#…

我的世界游戏安装

2019独角兽企业重金招聘Python工程师标准>>> Minecraft 是一款沙盘独立视频游戏&#xff0c;灵感来自于Infiniminer&#xff0c;使用Java编写&#xff0c;由Markus "Notch" Persson 所建立&#xff0c;现由Mojang AB 公司开发。 这里我们介绍如何在pcDuin…

RSA签名的PSS模式

本文由云社区发表作者&#xff1a;mariolu 一、什么是PSS模式&#xff1f; 1.1、两种签名方式之一RSA-PSS PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS&#xff08;Public Key Cryptography …

AI真人表情包、斗地主AI......DeeCamp学员做了50个好玩又实用的AI项目

8月16日&#xff0c;2019 DeeCamp人工智能训练营的结营仪式上&#xff0c;展示了600名DeeCamp学员的50个AI实践课题。 结营仪式上&#xff0c;由2019 DeeCamp学员组成的6个项目小组作为代表&#xff0c;现场展示了自己Demo成果&#xff0c;并由李开复、张潼等学术及产业导师现…

libcurl库的使用(通过libcurl库下载url图像)

1. 从http://curl.haxx.se/download.html下载libcurl源码&#xff0c;解压缩&#xff1b; 2. 通过CMake(cmake-gui)生成vs2013 x64位 CURL.sln&#xff1b; 3. 打开CURL.sln&#xff0c;编译会生成libcurl.dll动态库&#xff1b; 4. 在CURL.sln基础上&a…

SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法

2019独角兽企业重金招聘Python工程师标准>>> 一直想把数据库的默认路径修改一下&#xff0c;在网上找了一下&#xff0c;真的发现有办法 &#xff0c; 特拿 来与大家共同分享。 以下仅为参照&#xff0c;如果有多个实例&#xff0c;可能会有些许不同&#xff1a; …

Linux下多线程编程互斥锁和条件变量的简单使用

Linux下的多线程遵循POSIX线程接口&#xff0c;称为pthread。编写Linux下的多线程程序&#xff0c;需要使用头文件pthread.h&#xff0c;链接时需要使用库libpthread.a。线程是进程的一个实体&#xff0c;是CPU调度和分派的基本单位&#xff0c;它是比进程更小的能独立运行的基…

03基于python玩转人工智能最火框架之TensorFlow介绍

一句话介绍: Google开源的基于数据流图的科学计算库&#xff0c;适用于机器学习 不局限于机器学习&#xff0c;但目前被大多用于机器学习等。 TensorFlow计算流图的概念图 Tensor在图中流动。 TensorFlow的含义 拆字释义: Tensor 张量(tf中数据的表征) flow 流动 张量在图中流…

赴约北大,2019 CCF大数据与计算智能大赛正式启动

8月17日&#xff0c;以“数据驱动&#xff0c;智创未来”为主题的2019 CCF大数据与计算智能大赛&#xff08;2019 CCF BDCI&#xff09;全球启动仪式&#xff0c;在北京大学英杰交流中心阳光厅正式启幕。自2013年创办以来&#xff0c;大赛已成功举办六届&#xff0c;连续获得教…

Hadoop入门(10)_通过java代码实现从本地的文件上传到Hadoop的文件系统

2019独角兽企业重金招聘Python工程师标准>>> 第一步&#xff1a;首先搭建java的编译环境。创建一个Java Project工程&#xff0c;名为upload。 第二步&#xff1a;选中所需的Jar包。 选中JRE System Library 选择BuildPath Configure Build Path 选择ha…

Caffe源码中各种依赖库的作用及简单使用

1. Boost库&#xff1a;它是一个可移植、跨平台&#xff0c;提供源代码的C库&#xff0c;作为标准库的后备。 在Caffe中用到的Boost头文件包括&#xff1a; (1)、shared_ptr.hpp&#xff1a;智能指针&#xff0c;使用它可以不需要考虑内存释放的问题&#xff1b; (2)、dat…

漫画:5分钟了解什么是动态规划?

作者 | 调皮的阿广来源 | 视学算法&#xff08;ID&#xff1a;z872561826&#xff09;动态规划&#xff0c;英文是Dynamic Programming&#xff0c;简称DP&#xff0c;擅长解决“多阶段决策问题”&#xff0c;利用各个阶段阶段的递推关系&#xff0c;逐个确定每个阶段的最优决策…

小程序大转盘红包雨营销组件

前言 商城没几个营销活动能叫商城吗&#xff1f;所以就来几个组件吧&#xff0c;写的不好轻踩&#xff0c;对你有帮助记得给个小星星哦直接上链接github链接 运行例子 git clone https://github.com/sunnie1992/soul-weapp.git 微信开发者工具打开项目 营销组件 大转盘 "p…

Windows Server 2012 RDS系列:虚拟桌面化(5)

概述&#xff1a;本次将系列地测试Windows Server 2012 远程桌面服务&#xff08;RDS&#xff09;&#xff0c;将过程进行分享&#xff0c;总的感觉比2008 R2更简单了&#xff0c;体现着2012的自动化。2012的RDS部署有标准部署和快速启动两种&#xff0c;快速启动就是自动快速配…

里程碑式成果Faster RCNN复现难?我们试了一下 | 附完整代码

作者 | 已退逼乎 来源 | 知乎【导读】2019年以来&#xff0c;除各AI 大厂私有网络范围外&#xff0c;MaskRCNN&#xff0c;CascadeRCNN 成为了支撑很多业务得以开展的基础&#xff0c;而以 Faster RCNN 为基础去复现其他的检测网络既省时又省力&#xff0c;也算得上是里程碑性成…

【跃迁之路】【725天】程序员高效学习方法论探索系列(实验阶段482-2019.2.15)...

实验说明 从2017.10.6起&#xff0c;开启这个系列&#xff0c;目标只有一个&#xff1a;探索新的学习方法&#xff0c;实现跃迁式成长实验期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我将以自己为实验对象。我将开源我的学习方法&#xff0c;方法不断更新迭代&#…

C/C++各种数据类型转换汇总

以下是Windows/Linux系统中常用的C/C各种数据类型转换汇总&#xff1a;#ifndef FBC_MESSY_TEST_DATA_TYPE_CONVERT_HPP_ #define FBC_MESSY_TEST_DATA_TYPE_CONVERT_HPP_#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string>…

ASP.NET技巧:两个截取字符串的实用方法

两个截取字符串的实用方法&#xff08;超过一定长度自动换行&#xff09;1/** <summary> 2 /// 截取字符串&#xff0c;不限制字符串长度 3 /// </summary> 4 /// <param name"str">待截取的字符串</param> 5 /…