采用libiconv字符编码库,它包含了几乎所有的各种字符集,可以不依赖linux平台的字符集作为单独一个动态库存在!
libiconv-1.9.1 字符编码转换库编译方法
X86 Platform:
1> make distclean
2> ./configure
3> make
arca & ixp425 Platform:
1> 进行 X86 平台的./configure
2> 修改
./lib/Makefile
./libcharset/lib/Makefile
./libcharset/libtool
./src/Makefile
./srclib/Makefile
./libtool
将这些文件软链接重新链接到相应目录下的各个平台文件
arca: libtool.arca Makefile.arca
ixp425: libtoo.425 Makefile.425
3> make
将会在 ./lib/下生成libiconv_plug_linux.so 库文件,即可使用.
(./lib/.lib/libiconv.so.2.2.0 是libtoo脚本工具生成的libiconv.la,也可以使用)
测试代码:
#define tmpbufsize 4096
int iconv_string ( const char* tocode, const char* fromcode,
const char* start, const char* end,
char** resultp, size_t* lengthp )
{
iconv_t cd = iconv_open( tocode, fromcode );
size_t length;
char* result;
if ( cd == ( iconv_t ) ( -1 ) ) {
if ( errno != EINVAL )
return -1;
/* Unsupported fromcode or tocode. Check whether the caller requested
autodetection. */
if ( !strcmp( fromcode, "autodetect_utf8" ) ) {
int ret;
/* Try UTF-8 first. There are very few ISO-8859-1 inputs that would
be valid UTF-8, but many UTF-8 inputs are valid ISO-8859-1. */
ret = iconv_string( tocode, "UTF-8", start, end, resultp, lengthp );
if ( !( ret < 0 && errno == EILSEQ ) )
return ret;
ret = iconv_string( tocode, "ISO-8859-1", start, end, resultp, lengthp );
return ret;
}
if ( !strcmp( fromcode, "autodetect_jp" ) ) {
int ret;
/* Try 7-bit encoding first. If the input contains bytes >= 0x80,
it will fail. */
ret = iconv_string( tocode, "ISO-2022-JP-2", start, end, resultp, lengthp );
if ( !( ret < 0 && errno == EILSEQ ) )
return ret;
/* Try EUC-JP next. Short SHIFT_JIS inputs may come out wrong. This
is unavoidable. People will condemn SHIFT_JIS.
If we tried SHIFT_JIS first, then some short EUC-JP inputs would
come out wrong, and people would condemn EUC-JP and Unix, which
would not be good. */
ret = iconv_string( tocode, "EUC-JP", start, end, resultp, lengthp );
if ( !( ret < 0 && errno == EILSEQ ) )
return ret;
/* Finally try SHIFT_JIS. */
ret = iconv_string( tocode, "SHIFT_JIS", start, end, resultp, lengthp );
return ret;
}
if ( !strcmp( fromcode, "autodetect_kr" ) ) {
int ret;
/* Try 7-bit encoding first. If the input contains bytes >= 0x80,
it will fail. */
ret = iconv_string( tocode, "ISO-2022-KR", start, end, resultp, lengthp );
if ( !( ret < 0 && errno == EILSEQ ) )
return ret;
/* Finally try EUC-KR. */
ret = iconv_string( tocode, "EUC-KR", start, end, resultp, lengthp );
return ret;
}
errno = EINVAL;
return -1;
}
/* Determine the length we need. */
{
size_t count = 0;
char tmpbuf[ tmpbufsize ];
const char* inptr = start;
size_t insize = end - start;
while ( insize > 0 )
{
char * outptr = tmpbuf;
size_t outsize = tmpbufsize;
size_t res = iconv( cd, &inptr, &insize, &outptr, &outsize );
if ( res == ( size_t ) ( -1 ) && errno != E2BIG ) {
if ( errno == EINVAL )
break;
else {
int saved_errno = errno;
iconv_close( cd );
errno = saved_errno;
return -1;
}
}
count += outptr - tmpbuf;
}
{
char* outptr = tmpbuf;
size_t outsize = tmpbufsize;
size_t res = iconv( cd, NULL, NULL, &outptr, &outsize );
if ( res == ( size_t ) ( -1 ) ) {
int saved_errno = errno;
iconv_close( cd );
errno = saved_errno;
return -1;
}
count += outptr - tmpbuf;
}
length = count;
}
if ( lengthp != NULL )
* lengthp = length;
if ( resultp == NULL ) {
iconv_close( cd );
return 0;
}
result = ( *resultp == NULL ? malloc( length ) : realloc( *resultp, length ) );
*resultp = result;
if ( length == 0 ) {
iconv_close( cd );
return 0;
}
if ( result == NULL ) {
iconv_close( cd );
errno = ENOMEM;
return -1;
}
iconv( cd, NULL, NULL, NULL, NULL ); /* return to the initial state */
/* Do the conversion for real. */
{
const char* inptr = start;
size_t insize = end - start;
char* outptr = result;
size_t outsize = length;
while ( insize > 0 )
{
size_t res = iconv( cd, &inptr, &insize, &outptr, &outsize );
if ( res == ( size_t ) ( -1 ) ) {
if ( errno == EINVAL )
break;
else {
int saved_errno = errno;
iconv_close( cd );
errno = saved_errno;
return -1;
}
}
}
{
size_t res = iconv( cd, NULL, NULL, &outptr, &outsize );
if ( res == ( size_t ) ( -1 ) ) {
int saved_errno = errno;
iconv_close( cd );
errno = saved_errno;
return -1;
}
}
if ( outsize != 0 )
abort();
}
iconv_close( cd );
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
#include "iconv_string.h"
int main()
{
const char *s = "我来也";
char * result = NULL;
int size = 0;
if ( iconv_string( "utf-8", "gb2312", s, s + strlen(s), &result, &size ) < 0 ){
printf( "iconv_string /n" );
}
else {
printf("len=%d/n", size );
printf( "%s/n" , result );
}
}
Makefile
CC=gcc
CFLAGS= -g
export CC
export CFLAGS
INCS= -I../include
LIBS= -liconv_plug_linux
%o: %.c %.h
test:test.o iconv_string.o
${CC} $^ -o $@ ${LIBS}
clean:
rm -f *.o test
分享到:
相关推荐
嵌入式字符编码(经典)(ucs2,+unicode,+utf8,+gb2312)[借鉴].pdf
字符编码、内码,顺带介绍汉字编码 编码 计算机 嵌入式
详细描述了:字符编码ASCII、GB2312、Unicode、UTF-8区别。
LCD的现实原理,汉字信息的编码知识以及汉字与英文的混合显示
针对嵌入式名片识别系统中低质名片字符特征提取困难导致识别速度慢和识别率低的问题,提出使用字符加权模板和基于统计的字符特征提取算法相结合,对提取的特征进行编码匹配。该算法对字符模板进行加权操作和网格化...
常用嵌入式开发小工具合集,restful接口测试工具restclient 3.5、en.stvp-stm32、tcp调试、网络调试助手V3.8、串口调试、modbusttsj、Mathematica8.0、中英文字符编码查询_V1.1、amo的编程小工具集合V1.2.6等等。
对于这一类多语言需求的解决,在嵌入式产品中有其特殊的地方。以下,给出一种可能的解决方案。 该方案的核心思想是为所有文本建立索引,通过索引可以得到特定语言的文字编码,随后通过该编码获得字库资源,并进行...
一、嵌入式系统概论 1. 与通用计算机相比,嵌入式系统具有许多不同之处。不是其特点是(D): A. 嵌入式系统与应用紧密结合,具有很强的专用性 B. 嵌入式大多数面向应用,可靠性十分重要 C. 应用于过程控制、数据...
很不错的工具,有玩单片机,嵌入式的朋友,请拿走吧。
gb18030所有字符集与码表,表
第二节:QT4.7.0 在ARM平台移植 第三节:boa web服务器在PC上移植 第四节:boa web服务器在S3C2440开发板上移植 第五节:boa移植过程中出现的问题 第六节:sqlite-3.7.6.2在PC及S3C2440平台移植 第七节:ffmpeg...
3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 ...
哈夫曼编码是一种无损的高效的压缩方法。对文本文件进行哈夫曼编码,使用计算信源熵打开一个文件进行概率计算,然后将输出的 submit.txt 文件用哈夫曼编码打开,之后就会对文本文件中出现的字符进行哈夫曼编码。
在开发嵌入式系统时,需要显示不同大小或类型字体的汉字。显 然,对于嵌入式系统,不太可能使用矢量字体,在这种情况下,点阵 字体就显现出了它的优点。 本软件可以在 WINDOWS 系统下生成任意点阵大小的 ASCII, GB...
地质床 此Golang套件包含嵌入式地理编码器。 除了一些下载的数据... 随着时间的推移,它应该会有所改善,但是目前,它在约0.0125-0.0135秒(在Macbook Pro中)中将字符串地理编码为lat / lng。 用法 您应该重新使用
51单片机下LCD1602液晶屏的使用示例(显示字符、数字、字符串等),使用的是UTF-8编码,如果出现乱码,请修改为UTF-8编码格式,注意:请自行根据你的单片机修改引脚号,可参考文章:...STC89C52
因此,在使用CCSv5工具链进行编译后,您还需要Linux上的mspdebug()进行下载/调试。 在Linux上,可以使用mspgcc工具链代替CCSv5。 该软件包在Linux上同时支持mspgcc和CCSv5。 在继续之前,请确保您的工具链正在运行...
1、发送31,使LED3亮;发送30,使LED3灭;发送41,使LED4亮;发送40,使LED4灭; 2、发送LED3_ON,使LED3亮;发送LED3_OF,使LED3灭;发送LED4_ON,使LED4亮;发送LED4_OF,使LED4灭
超多,齐全,嵌入式多种软件,种类繁多.rar嵌入式多种软件,种类繁多.rar嵌入式多种软件,种类繁多.rar