libiconv转码

Windows下安装libiconv库教程(转换字符编码库) Windows下安装libiconv库(转换字符编码库) 示例:VS2019安装(库版本: 1.9.2) 1. 下载库文件 访问libiconv库官网[ GNU libiconv库Windows下载地址 ] 找到 Download 标签 下载 Complete package, except sources (完整的软件包,源代码除外) ... 阅读详情

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  1024

bool 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-1.11.1-windows编译 libiconv-1.11.1在windows上使用cmake编译,包含vs2008、vs2015实践编译步骤,同样也支持其他版本的vs。一次可生成libiconv的动态库dll、静态库lib,以及mt和md方式编译,可供后续开发灵活使用。 本文操作按照《c&c++开源库编译指南》中内容规范编写,编译环境配置、工具下载、目录规划,及更多其他开源库编译方法请参考该文章。 阅读详情

相关推荐

C语言自动识别文本编码

用C语言在编写一些文本处理程序时,文本编码就成为了很重要的部分, 但C语言本身,处理文本又十分困难,虽然有wchar_t这类标准库支持, 然后事实是各类编译器对其支持也不相同,而且缺乏一致的标准。本次就来探讨可移植的转码库libiconv和自动文本格式识别库Mozilla Universal Character Set。

西风世界 7765

libiconv的介绍

来源:'http://dxwang.blog.51cto.com/384651/538113 介绍 由于历史原因,国际上的各国文字都是依赖于自己本国语言而编码的。后来,随着Internet的出现和各国之间逐渐频繁的文字交流(比如浏览国外的Web页面),编码之间的转换就显得非常重要。这时也出现了一个问题,很多字符在一种编码中出现而没有被另一种编码包含。为了解决这种编码带来的混乱,人们

毅修的专栏 6594

实现自己的AI视频监控系统-第一章-视频拉流与解码4(重点)

使用本章节代码请引用此优快云链接,尊重知识、尊重他人劳动。这一小节将正式进入代码实现部分。我们会结合实际业务需要和拉流解码流程实现一个灵活、轻便、易用的视频拉流解码模块,支持多路视频拉流解码且可以动态更新更新内部参数。在开始设计之初,我们首先考虑的是使用大家所熟知的 **OpenCV(cv2.VideoCapture)**来实现拉流和解码功能。它的 API 简单直接,几行代码就能实现从网络流中读取帧,对于快速原型验证来说非常方便。然而,在经过深入的调研和测试后,我们发现 OpenCV 在处理多路视频流、追

soulproficiency的博客 2268

【亲测免费】 推荐开源项目:libiconv - 灵活的字符集转换库

推荐开源项目:libiconv - 灵活的字符集转换库 1、项目介绍 libiconv 是一个广泛使用的字符集转换库,源自 GNU 项目。最新版本为2022.05.15的1.17版,其开发现在已被迁移至 Savannah GNU项目页面。虽然 iconv.exe 因为遵循GPL许可证而面临一些构建限制,但 libiconv 本身是LGPL授权,允许更广泛的使用和集成,特别是对于使用Microsof...

gitblog_00017的博客 1079

LVDS系列11:Xilinx Ultrascale系可编程输入延迟(一)

按照IDELAYCTRL的参考时钟频率可以准确计算获取到,如200M参考时钟抽头分辨率为78ps,Ultrascale系列相对于7系列架构大改,体现便是U/U+系列的抽头增加到512个,同时每个抽头的分辨率就无法像7系列那样能得到一个准确的值,是一个波动的范围值,抽头分辨率随着工艺温度电压的变化而变化。EN_VTC:电压温度补偿开启的使用信号,COUNT模式下不能使用,必须保持为0,TIME模式下需要使用,在延迟工作时要启用温度电压补偿,在修改抽头值时需要关闭温度电压补偿,修改完后启用;

weixin_38828382的博客 1941

知识图谱-KGE-语义匹配-双线性模型-2018:SimplE

【paper】 SimplE Embedding for Link Prediction in Knowledge Graphs 【简介】 本文是加拿大英属哥伦比亚大学的两位学者发表在 NIPS 2018 上的工作,文章提出了 SimplE(Simple Embedding)。这篇和前面一篇差不多,也是对 1927 年的 CP 进行改进(简化),传统CP为实体分配的两个向量是独立训练的,SimplE利用关系的逆在三元组打分函数中加上了一个对称项,使得每个实体的两个向量依赖学习,并且 SimplE 的复杂度随

u013250861的博客 958

libiconv库裁剪(最终20k左右)

注意:若系统未安装gperf,有root权限直接安装gperf即可,没有root权限,可将gperf安装到本地,添加安装路径到本用户环境变量再执行即可。1、打开aliases.gperf,到CSISOLATIN1, ei_iso8859_1这一行,需要保留的,后面的可以自由删减。优化思路:修改aliases.gperf和encodings.def文件,去掉一些无用的字符集,保留自己需要的。1、删除多余.h文件,参照converters.h注释掉的文件,只保留以下几个头文件。

weixin_42041633的博客 996

6、Cocos2D游戏开发:精灵添加与角色实现

本文详细介绍了在Cocos2D游戏开发中如何添加背景精灵和玩家角色精灵。通过创建GameScene场景、组织项目资源、使用多分辨率图像适配不同设备,并深入讲解了将角色拆分为上下半身以实现更真实瞄准效果的原理。文章还解析了Cocos2D的图像搜索机制、锚点概念及其应用,以及如何通过父子节点关系管理复合角色。最终实现了猎人角色在场景中的正确显示与定位,为后续动画和交互功能打下基础。

e3f4g5的博客 90

cocos2dx libiconv 转码

iconv下载(Android)已编译完的iconv包(用这个即可) ios自带libiconv,只需#include <iconv.h>即可 步骤 1.libiconv解压文件放置 直接将解压的libiconv文件夹放在cocos2dx游戏引擎cocos2d-x-2.1.4目录下 写Android.mk放到libiconv根目录下 LOCAL_PATH...

weixin_30888413的博客 171

万字数据仓库面试题及参考答案

星型模型由一个中心的事实表和多个外围的维度表组成,事实表存储度量值和事实,维度表存储描述性属性和维度。星型模型和雪花模型的区别在于雪花模型将维度表进一步细化,形成多层次的结构,而星型模型由一个中心事实表和多个维度表组成,适用于查询较为简单的情况。维度建模通常采用星型模型或雪花模型,将数据分为事实表和维度表,其中事实表存储度量值和事实,维度表存储描述事实的属性。三者之间的关系可以这样理解:数据仓库主要关注历史数据的存储和分析,数据中台则关注数据的服务化和资产化,而数据湖则关注原始数据的存储和多样性。

大模型大数据攻城狮的专栏 560

Qt5.14.2开发Mqtt应用程序

然后,你就做不下去了…很明显,大部分博主写的东西不是缺头就是缺尾,带偏了许多读者。,因此我们需要clone的是这个分支版本,而不是这个默认的。然后将编译产物中include里的所有.h文件复制到。下载完后直接默认安装即可,这一步没什么好说的。看到了没,这个才是正确的操作方式,而主线的。信号来判断,自行实现自己的槽函数。然后选择构建方式,这里我选择的是。信号来判断自行实现自己的槽函数。信号来判断自行实现自己的槽函数。源代码,如下图所示,双击打开。收到下行消息时,可以通过连接。

Bruce.yang的嵌入式之旅 2310

裁剪libiconv字符转码库

最近完成了libiconv字符转换库的裁剪,现分享一下心得 1.libiconv是啥? libiconv是一个字符转换库,同一个字符在不同的标准下面对应的编码方式不同,比如: libiconv就是完成不同编码方式的转换。在K2上面的使用pppoe中文账户名拨号和lighttpd(web界面有关)的moileapp的界面显示时会用到转码功能,需求是将汉字字符由utf-8编码

kobemini的博客 2167

Ollama DNS 重新绑定攻击 (CVE-2024-28224)

一旦 DNS 重新绑定攻击成功,攻击者就可以对这些 API 进行排序,以读取 Ollama 运行的进程可访问的任意文件数据,并将这些数据泄露到攻击者控制的系统中。完成对“创建模型” API 请求的调用后,Ollama 将收集组成新创建的用户模型的许多工件,包括大型语言模型数据、许可证数据等,以及我们要提取的文件,所有这些都可以通过其 SHA256 内容进行寻址。这是我们要窃取的文件,在我们的示例中,是可通过运行 Ollama 的主机上的路径名访问的现有文本文件。值得注意的是,该模型配置为通过参数中的。

技术超强的网络安全平台 1648

LibIconv实现转码(会出现内存泄漏)

std::string code_convert(char* source_charset, char* to_charset, const std::string& sourceStr) //sourceStr是源编码字符串 { libiconv_t cd = libiconv_open(to_charset, source_charset);//获取转换句柄,void*类型 if (cd == 0) { libiconv_close(cd); r.

王家胜的博客 622

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

字符转码开源库libiconv目前还不支持64位

最新版的libiconv 1.14目前还不支持64位系统,只能编译出32位库。libiconv 1.14下载地址:http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gzlibiconv介绍:http://www.gnu.org/software/libiconv/linux系统编译安装方法:$ ./configure --prefix=/u

蓝蓝的天 5886

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux下使用libiconv库转码

iconv命令实现linux下字符集编码的转换 windows下的文件复制到linux下时常会乱码,因为windows下文件编码为GBK,linux下默认文件编码为UTF-8,故需要libiconv库转码。 1.iconv命令用法如下: iconv [选项...] [文件...] 输入/输出格式规范: -f, --from-code=名称 原始文本编码 -t, -...

weixin_30646505的博客 369

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

libiconv android编译,linux环境下libiconv库基于Android NDK的编译方法

libiconv是一个跨平台的提供转码函数的开源库,它提供了一个转换函数:iconv()来实现不同编码之间的转换,在Android平台上libxml2库的编译需要用到libiconv库,所以需要编译出libiconv库才能够实现libxml2的基于Android NDK的编译,为此对libiconv库进行了编译分析,最终成功,并以此进行记录。至于Android NDK平台的编译环境搭建具体可以参考...

weixin_28925169的博客 591

40.linux下安装libiconv库:GB2312与UTF-8转码测试

目录一: libiconv库简介:二:下载:三:编译:四:测试: 一: libiconv库简介: libiconv库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。 随着互联网时代的到来,通过互联网进行文字交流也逐渐增多:浏览外国的网站,这个时候字符编码的转换变得尤为重要。这带来了一个问题,就是许多字符在某一种编码方式中没有。为了解决这种混乱,Unicode的编码方式被建立。Unicode是一种超级编码包含了所有这些编码的字符集,因此一些新的文本格式像XML的默认

yanghangwww的博客 1008

交叉编译libiconv库移植到mips平台openwrt系统

最近一段时间由于项目原因,需要将现有应用程序移植到mips平台的openwrt系统上。使用对应的编译工具链编译应用程序后就扔到系统上跑了,但是看log发现汉字转码部分报错(utf-8和gbk互转),iconv_open返回值为-1,errno为2。将转码格式中的gbk换成其他格式不报错,因此猜测是库中缺少对gbk编码的支持。 网上查了下发现openwrt中自带库对很多亚洲字符集做了屏蔽,解决方法...

guoyuan21的博客 1168

libiconv移植

先下载libiconv库,我用的是libiconv-1.12,解压后进行交叉编译: ./configure --host=arm –prefix=/home/my/iconv/  CXX=arm -linux-gnu-g++   CC=arm -linux-gnu-gcc-3.4.5 LDFLAGS="-L/opt/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/

sleep技术讨论区 2337

关于在ARM平台下,iconv转码函数,调用出错问题的解决方案

ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法: 1. 先下载转码库:libiconv-1.14.tar.gz 2. 假设交叉编译工具arm-gcc,安装在 /usr/local/arm 编译命令arm-linux-gcc,的环境变量是:/usr/local/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-...

Huihong_Vitality的博客 2788

002-告别乱码-libiconv-C++开源库108杰

1. 理解乱码产生的原因 2. 手把手教学如何封装 libiconv 的转换操作 3. 借助封装成果,解决 fswatch 库示例项目的乱码问题

第2学堂-专栏 1025

告别乱码!用libiconv给autocutsel打补丁实现跨平台剪贴板无忧传输

本文详细介绍了如何利用libiconv为autocutsel工具打补丁,解决跨平台剪贴板传输中的中文乱码问题。通过编码转换技术,实现GBK与UTF-8之间的无缝转换,确保Windows与Linux系统间剪贴板内容准确传递。文章包含完整的编译指南、实战配置及故障排除方案,帮助开发者彻底告别乱码困扰。

n7o8p的博客 161

利用libiconv解决autocutsel跨平台中文乱码问题

本文详细介绍了如何利用libiconv库解决autocutsel工具在跨平台(如Windows与Linux)使用时的中文乱码问题。文章深入剖析了乱码根源在于GBK与UTF-8编码不匹配,并提供了从原理分析、代码修改到编译安装的完整实战指南,最终通过注入编码转换能力,实现了中文剪贴板内容的流畅同步。

weixin_29311017的博客 208
上一篇: malloc(0)
下一篇: 如何在没有头文件的情况下调用动态库的类的私有成员函数
山有木兮啊
博客等级 码龄8年 135粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值