libiconv转码

2024-02-05 21:44
文章标签 转码 libiconv

本文主要是介绍libiconv转码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

libiconv转码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include <string>
#include <iostream>#include "iconv.h"
#include "libcharset.h"#define INVALID_ICONV_HANDLE ((iconv_t)-1)
#define INVALID_ICONV_RETURN ((size_t)-1)#define CACHE_SIZE  1024bool UTF8_2_UTF16LE(const std::string &u8String, std::u16string &u16String)
{if (u8String.empty()){return true;}char *pU8Begin = (char *)u8String.c_str();size_t inputSize = u8String.size();std::u16string outU16String;outU16String.reserve(inputSize);iconv_t iconvHandle = iconv_open("UTF-16LE", "UTF-8");if (INVALID_ICONV_HANDLE == iconvHandle) {perror("iconv_open");return false;}printf("inputSize: %zu\n", inputSize);bool result = true;while (inputSize > 0){char outputBuf[CACHE_SIZE] = {0};char *pOutputBuf = outputBuf;size_t outputLen = CACHE_SIZE;size_t leftOutputLen = CACHE_SIZE;size_t nRet = iconv(iconvHandle, &pU8Begin, &inputSize, &pOutputBuf, &leftOutputLen);if (INVALID_ICONV_RETURN == nRet) {switch (errno) {case EINVAL:printf("An incomplete multibyte sequence has been encountered in the input.\n");result = false;break;case EILSEQ:printf("An invalid multibyte sequence has been encountered in the input.\n");result = false;break;case E2BIG:printf("buffer is small\n");break;default:break;}}if (!result){outU16String.clear();break;}printf("nRet: %zu left: %zu leftOutputLen: %zu\n", nRet, inputSize, leftOutputLen);outU16String.append((char16_t *)outputBuf, (outputLen - leftOutputLen) / sizeof(char16_t));}u16String.append(outU16String);iconv_close(iconvHandle);return result;
}bool UTF16LE_2_UTF8(const std::u16string &u16String, std::string &u8String)
{if (u16String.empty()){return true;}char *pU8Begin = (char *)u16String.c_str();size_t inputSize = u16String.size() * sizeof(char16_t);std::string outU8String;outU8String.reserve(inputSize);iconv_t iconvHandle = iconv_open("UTF-8", "UTF-16LE");if (INVALID_ICONV_HANDLE == iconvHandle) {perror("iconv_open");return false;}bool result = true;while (inputSize > 0){char outputBuf[CACHE_SIZE] = {0};char *pOutputBuf = outputBuf;size_t outputLen = CACHE_SIZE;size_t leftOutputLen = CACHE_SIZE;size_t nRet = iconv(iconvHandle, &pU8Begin, &inputSize, &pOutputBuf, &leftOutputLen);if (INVALID_ICONV_RETURN == nRet) {switch (errno) {case EINVAL:printf("An incomplete multibyte sequence has been encountered in the input.\n");result = false;break;case EILSEQ:printf("An invalid multibyte sequence has been encountered in the input.\n");result = false;break;case E2BIG:printf("buffer is small\n");break;default:break;}}if (!result){outU8String.clear();break;}printf("nRet: %zu left: %zu leftOutputLen: %zu\n", nRet, inputSize, leftOutputLen);outU8String.append(outputBuf, (outputLen - leftOutputLen) / sizeof(char));}u8String.append(outU8String);iconv_close(iconvHandle);return result;
}int main()
{const char* charset = locale_charset();printf("local charset: %s\n", charset);char utf8string[] ="你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界""你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界""你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界""你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界""你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界""你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界";std::u16string u16String;UTF8_2_UTF16LE(utf8string, u16String);std::string u8String;UTF16LE_2_UTF8(u16String, u8String);printf("%s\n", u8String.c_str());return 0;
}

这篇关于libiconv转码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682255

相关文章

JS 对中文进行转码防止乱码

var BREED_TYPE = escape(breedType);//进行转码diag.URL = 'test_add.jsp?BREED_TYPE='+BREED_TYPE //弹出一个新的页面var Request = new Object();Request = GetRequest();var breedType = Request["BREED_TYPE"];//看到正

通过cmd命令的方式转码MP4为webp动图。附带命令解释。

zihao 通过cmd命令的方式转码MP4为webp动图: 均衡大小和z效果的配置(直接拷贝后需要改下路径): ffmpeg -i E:\steam\222.mp4 -vcodec libwebp -filter:v fps=fps=24 -lossless 0 -compression_level 5 -q:v 35 -loop 1 -preset default -

cocos2d_x使用iconv库转码解决中文显示问题

关于cocos2dx中文显示,流行有三种解决方案。      1、客户端全部使用UTF-8文件。       这种办法对于写在客户端上的文字还是挺有用的,但对于服务端发送过来的中文就显示乱码了,但如果是单机还是挺推荐的。可以用宏定义的方法将固定的内容定义在某个文件,如果想发展国外市场版本,可以直接拿这个文件给翻译。      2、使用iconv库。      3、使用xml文件读取。      这

关于:无法解析的外部符号 _libiconv报错的解决方法

今天用Release的时候遇到这样的一个报错: 6>Tools.obj : error LNK2001: 无法解析的外部符号 _libiconv_close 6>Tools.obj : error LNK2001: 无法解析的外部符号 _libiconv_open 6>Tools.obj : error LNK2001: 无法解析的外部符号 _libiconv 6>E:\cocos2d\co

utf-8、gbk、unicode相互转码的几种方式

utf-8、gbk、unicode相互转码的几种方式 以下代码是java对于常见编码方式进行相互转换的,主要是gbk和utf-8互转,gbk与uncode互转,utf-8与unicode互转。 package com.encoding.util;import java.io.UnsupportedEncodingException;import java.lang.Characte

JavaScript处理HTML的Encode(转码)和Decode(解码)

转载:http://www.cnblogs.com/xdp-gacl/p/3722642.html HTML的Encode(转码)和解码(Decode)在平时的开发中也是经常要处理的,在这里总结了使用javascript处理HTML的Encode(转码)和解码(Decode)的常用方式 一、用浏览器内部转换器实现转换 1.1.用浏览器内部转换器实现html转码   首先动态创建一个容

iOS_技巧(4)_转码(UTF-8 /GBK/Unicode/GBK2312)

一丶 UTF-8 /GBK UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。 GBK全称《汉字内码扩展规范

编译安装libiconv报错:./stdio.h:1010:1: error: 'gets' undeclared here (not in a function)

1. libiconv编译时遇到以下报错 In file included from progname.c:26:0:./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead")

视频批量剪辑新境界:一键转码MP4至MP3并自动删除原文件,轻松优化存储空间与播放体验

随着数字媒体的飞速发展,视频文件已成为我们生活中不可或缺的一部分。然而,大量视频文件的累积不仅占据了宝贵的存储空间,而且在某些情况下,我们更希望提取视频中的音频内容。为了满足这一需求,我们推出了全新的视频批量剪辑方案,让你轻松实现MP4到MP3的转码,并自动删除原文件,优化存储空间,提升播放体验。 首先,让我们进入“视频剪辑高手”的主页面。简洁明了的界面设计,让您一眼就能找到所需的功能板

网站禁止百度转码

网站在移动端的阅读不可避免的会遇到转码问题,作为国内搜索引擎老大百度,自然要做技术的领头人了,做了百度转码,有些网站经过转码之后达到了想要的结果,但是有些网站经过百度加工后就是不忍直视,很多内容出现了错乱,Joe的网站也出现了一些错位,于是Joe用了Wordpress插件MobilePress,经过一些汉化修改,感觉比百度的转码更适合自己。 下面就来说一下如何禁止网站在移动端的百度转码,百度