unicode转GB2312时,假如要显示“今星期一,天气不错。”unicode码为“4E CA 59 29 66 1F 67 1F 4E 00 FF 0C 59 29 6C 14 4E 0D 95 19 30 02” 但是调试的时候,只能显示“今天星期”,“一”之后的字符就无法显示出来。其中“一”的unicode为“4E 00 ”我试了其他unicode中只要有00就无法显示。
29 个解决方案
#1
mark
#2
#include <iconv.h>
#define OUTLEN 255
#include <stdlib.h>
#include <stdio.h>
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int
outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("unicode","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","unicode",inbuf,inlen,outbuf,outlen);
}
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char unicode[4];
char *in_gb2312 = "一"; //“一”不知为什么出不来
char out[OUTLEN];
char out2[OUTLEN];
int rc;
int i;
char c,c1,c2;
int num=0;
int e;
char b[100]="4ECA5929661F671F4E00FF0C59296C144E0D95193002"; //今星期一,天气不错。
char a[100];
char ff[140];
char un[2];
un[0]=0x00; //“一”,4E00
un[1]=0x4E;
rc = u2g(un,strlen(un),out2,OUTLEN);
printf(" out2=%s\n",out2);
//unicode码转为gb2312码,转换Unicode顺序(如5BB6->B65B)。 今星期一,天气不错。
//下面代码是将单个字符串的unicode码的高位和低位呼唤
for (i=0; b[i]!='\0'; i=i+4)
{
a[i]=b[i+2];
a[i+1]=b[i+3];
a[i+2]=b[i];
a[i+3]=b[i+1];
num=num+1;
}
printf("num=%d\n, %s\n", num, a);
for (i=0; i<4*num;i=i+2)
{
if (a[i]>='0'&&a[i]<='9')
{
e=(int)(a[i]);
printf("e=%d\n",e);
e=(int)(a[i])-48;
e=e<<4;
c1=e&0xf0;
}
if (a[i]>='A'&&a[i]<='F')
{
e=(int)(a[i])-55;
e=e<<4;
c1=e&0xf0;
}
if (a[i+1]>='0'&&a[i+1]<='9')
{
e=(int)(a[i+1])-48;
c2=e&0x0f;
}
if (a[i+1]>='A'&&a[i+1]<='F')
{
e=(int)(a[i+1])-55;
c2=e&0x0f;
}
c=c1|c2;
ff[i/2]=c;
printf("%d , ff=%x\n",i/2, ff[i/2]);
}
rc = u2g(ff,strlen(ff),out,OUTLEN);
printf(" fft=%s\n",out);
}
#define OUTLEN 255
#include <stdlib.h>
#include <stdio.h>
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int
outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("unicode","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","unicode",inbuf,inlen,outbuf,outlen);
}
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char unicode[4];
char *in_gb2312 = "一"; //“一”不知为什么出不来
char out[OUTLEN];
char out2[OUTLEN];
int rc;
int i;
char c,c1,c2;
int num=0;
int e;
char b[100]="4ECA5929661F671F4E00FF0C59296C144E0D95193002"; //今星期一,天气不错。
char a[100];
char ff[140];
char un[2];
un[0]=0x00; //“一”,4E00
un[1]=0x4E;
rc = u2g(un,strlen(un),out2,OUTLEN);
printf(" out2=%s\n",out2);
//unicode码转为gb2312码,转换Unicode顺序(如5BB6->B65B)。 今星期一,天气不错。
//下面代码是将单个字符串的unicode码的高位和低位呼唤
for (i=0; b[i]!='\0'; i=i+4)
{
a[i]=b[i+2];
a[i+1]=b[i+3];
a[i+2]=b[i];
a[i+3]=b[i+1];
num=num+1;
}
printf("num=%d\n, %s\n", num, a);
for (i=0; i<4*num;i=i+2)
{
if (a[i]>='0'&&a[i]<='9')
{
e=(int)(a[i]);
printf("e=%d\n",e);
e=(int)(a[i])-48;
e=e<<4;
c1=e&0xf0;
}
if (a[i]>='A'&&a[i]<='F')
{
e=(int)(a[i])-55;
e=e<<4;
c1=e&0xf0;
}
if (a[i+1]>='0'&&a[i+1]<='9')
{
e=(int)(a[i+1])-48;
c2=e&0x0f;
}
if (a[i+1]>='A'&&a[i+1]<='F')
{
e=(int)(a[i+1])-55;
c2=e&0x0f;
}
c=c1|c2;
ff[i/2]=c;
printf("%d , ff=%x\n",i/2, ff[i/2]);
}
rc = u2g(ff,strlen(ff),out,OUTLEN);
printf(" fft=%s\n",out);
}
#3
上面是我编的程序!
#4
可以這麼做unicode-->utf--->gb2312
試試看
試試看
#5
Arthur_()
mark是什么意思?
能详细点解释一下吗?
mark是什么意思?
能详细点解释一下吗?
#6
好的,我试一试看!
#7
我只是標記一下
因為我以前也用過iconv不過是gbk-utf的
後來移植時候不支持iconv
所有讓window那邊負責轉化所有的碼
因為我以前也用過iconv不過是gbk-utf的
後來移植時候不支持iconv
所有讓window那邊負責轉化所有的碼
#8
好像是这样:
现在的unicode码已经不再是以前的16位了, 而是31位
可以把整个码表分为两段
UCS2(双字节) 码值介于0x0000 - 0xFFFF之间
USC4(四字节) 码值介于0x10000 - 0x10FFFF之间(可以用utf8和utf16表示),
码值介于0x110000 - 0x7FFFFFFF之间(utf16无法表示)
你直接给iconv_open带入"unicode"参数是让他以utf16进行转码?
对iconv系列不太了解, 不过就我所知表示汉字(GB兼容)utf8是3字节,utf32是4字节
而只有utf16是两字节表示一个汉字的, 但是有几个码段是保留区域, 是不能直接拿来当作unicode码的....
看下这个:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节), 先假设一个u
u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位) 将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x110000的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
现在的unicode码已经不再是以前的16位了, 而是31位
可以把整个码表分为两段
UCS2(双字节) 码值介于0x0000 - 0xFFFF之间
USC4(四字节) 码值介于0x10000 - 0x10FFFF之间(可以用utf8和utf16表示),
码值介于0x110000 - 0x7FFFFFFF之间(utf16无法表示)
你直接给iconv_open带入"unicode"参数是让他以utf16进行转码?
对iconv系列不太了解, 不过就我所知表示汉字(GB兼容)utf8是3字节,utf32是4字节
而只有utf16是两字节表示一个汉字的, 但是有几个码段是保留区域, 是不能直接拿来当作unicode码的....
看下这个:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节), 先假设一个u
u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位) 将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x110000的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
#9
晕...
好像不是这个问题...
4E00调转字节后是004e
原字符被00截断, 将字符串带入后,转换到00就over了
好像不是这个问题...
4E00调转字节后是004e
原字符被00截断, 将字符串带入后,转换到00就over了
#10
rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen
不能用strlen
#11
我一會做下, 等等
我的是utf8-gdk2312-utf8
我的是utf8-gdk2312-utf8
#12
rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen
======
-_#
不能用strlen
======
-_#
#13
:目
#14
我的是utf8-gdk2312-utf8
我的都ok
我的都ok
#15
你的可以? 我去putty一下...
#16
恩, window那邊的做法是utf-unicode-gb2312
它發送給我信息時候也轉化gb2312-->unicode--gb2312
你的問題偶也不清楚, 不過很灌注
它發送給我信息時候也轉化gb2312-->unicode--gb2312
你的問題偶也不清楚, 不過很灌注
#17
你可以对utf8的文件做下预处理,把所有0x00换成0x20,然后就能用strlen了
#18
iconv()中的inbuf/outbuf参数不能理解为字符串, 它是个inlen/outlen/长度的buffer,
inlen指示buffer的字节数,不是字符串长度,更不能用strlen得到inlen/outlen
inlen指示buffer的字节数,不是字符串长度,更不能用strlen得到inlen/outlen
#19
不知道说的对不对,我这没linux没法试验, putty那边是solaris没iconv库...
#20
用这个main试一下:
int main(int argc, char *argv[]) {
int rc;
unsigned char gb_buf[256] = {};
unsigned short uni_buf[32] = { 0x4ECA,0x5929,0x661F,0x671F,0x4E00, //'今星期一'
0xFF0C, //','
0x5929,0x6C14,0x4E0D,0x9519, //'天气不错'
0x3002,0x0000 }; //'。\0'
printf("\nucs2 to gb2312: ");
if(rc = u2g(uni_buf, INLEN, gb_buf, OUTLEN)) {
printf("%s\n",out);
}else {
printf("faild(%d)\n", rc);
}
}
int main(int argc, char *argv[]) {
int rc;
unsigned char gb_buf[256] = {};
unsigned short uni_buf[32] = { 0x4ECA,0x5929,0x661F,0x671F,0x4E00, //'今星期一'
0xFF0C, //','
0x5929,0x6C14,0x4E0D,0x9519, //'天气不错'
0x3002,0x0000 }; //'。\0'
printf("\nucs2 to gb2312: ");
if(rc = u2g(uni_buf, INLEN, gb_buf, OUTLEN)) {
printf("%s\n",out);
}else {
printf("faild(%d)\n", rc);
}
}
#21
你只要記得windows上是utf-16(就是雙字節Unicode), liunx上是utf-8,這兩種都是unicode,但是編碼的方式不一樣。 然后再考慮你的轉換方法。
#22
mark
#23
wchar_t 在linux下是四字节的,
你可以试着在uni_buf尾部再添一个0x0000,这样串结束符就是0x00000000
这样 (wcslen((wchar_t)uni_buf)<<1)就是uni_buf中的长度了
你可以试着在uni_buf尾部再添一个0x0000,这样串结束符就是0x00000000
这样 (wcslen((wchar_t)uni_buf)<<1)就是uni_buf中的长度了
#24
mark
#25
抱歉, 上面的说错了, 现在更正一下:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;//模版0xD800和0xDC00又称代理对
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;//模版0xD800和0xDC00又称代理对
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
#26
额...再更正一下:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 0xxxxxxx 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 0xxxxxxx 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
#27
Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Totalview Debugger 正是在这种情况下应运而生!
Intel软件可以在英特尔架构上产生出色的应用程序性能,并可以利用最新英特尔多核处理器的各项先进功能。TotalView Debugger与Intel软件的结合将会掀起一场linux下调试工具的革命!
TotalView Debugger是一个linux平台并行环境下的调试工具,它的IDE环境、多线程(进程)调试能力、内存调试能力、集群调试能力在业界都是无与伦比的!
XLsoft携手Intel、TotalView公司于2008年10月30日在上海举行“Linux 环境下的多核调试”免费培训讲座。我们非常荣幸地邀请您参加,并提供免费软件试用光盘!
一、报名方式:
电话:021-62128912/010-84492749
Email:Marketing@xlsoft.com.cn
二、讲座内容:
1. Linux 平台下程序调试工具概述
2. Intel 软件功能介绍
3. Totalview Debugger功能介绍
三、讲座时间:
2008年10月30日(星期四)14:00 ~ 17:00
四、讲座地点:
上海青松城大酒店3楼长悦厅
(徐家汇肇家浜路777号东安路口,距衡山路站约15分钟路程)
四、活动详情:
联系人:王娟
Tel:021-62128916 Mobile: 15000262606
E-mail:kiko.wang@xlsoft.com.cn
咨询热线:
021-62128912 010-84492749
更多的服务信息,请联系我们Marketing@xlsoft.com.cn or 联系方式。
上海世全软件信息技术有限公司
联系电话 上海:021-62128912 北京:010-84492749
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Totalview Debugger 正是在这种情况下应运而生!
Intel软件可以在英特尔架构上产生出色的应用程序性能,并可以利用最新英特尔多核处理器的各项先进功能。TotalView Debugger与Intel软件的结合将会掀起一场linux下调试工具的革命!
TotalView Debugger是一个linux平台并行环境下的调试工具,它的IDE环境、多线程(进程)调试能力、内存调试能力、集群调试能力在业界都是无与伦比的!
XLsoft携手Intel、TotalView公司于2008年10月30日在上海举行“Linux 环境下的多核调试”免费培训讲座。我们非常荣幸地邀请您参加,并提供免费软件试用光盘!
一、报名方式:
电话:021-62128912/010-84492749
Email:Marketing@xlsoft.com.cn
二、讲座内容:
1. Linux 平台下程序调试工具概述
2. Intel 软件功能介绍
3. Totalview Debugger功能介绍
三、讲座时间:
2008年10月30日(星期四)14:00 ~ 17:00
四、讲座地点:
上海青松城大酒店3楼长悦厅
(徐家汇肇家浜路777号东安路口,距衡山路站约15分钟路程)
四、活动详情:
联系人:王娟
Tel:021-62128916 Mobile: 15000262606
E-mail:kiko.wang@xlsoft.com.cn
咨询热线:
021-62128912 010-84492749
更多的服务信息,请联系我们Marketing@xlsoft.com.cn or 联系方式。
上海世全软件信息技术有限公司
联系电话 上海:021-62128912 北京:010-84492749
#28
mark
#29
哥们 可以查表转码制的。。。。。。。。
#1
mark
#2
#include <iconv.h>
#define OUTLEN 255
#include <stdlib.h>
#include <stdio.h>
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int
outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("unicode","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","unicode",inbuf,inlen,outbuf,outlen);
}
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char unicode[4];
char *in_gb2312 = "一"; //“一”不知为什么出不来
char out[OUTLEN];
char out2[OUTLEN];
int rc;
int i;
char c,c1,c2;
int num=0;
int e;
char b[100]="4ECA5929661F671F4E00FF0C59296C144E0D95193002"; //今星期一,天气不错。
char a[100];
char ff[140];
char un[2];
un[0]=0x00; //“一”,4E00
un[1]=0x4E;
rc = u2g(un,strlen(un),out2,OUTLEN);
printf(" out2=%s\n",out2);
//unicode码转为gb2312码,转换Unicode顺序(如5BB6->B65B)。 今星期一,天气不错。
//下面代码是将单个字符串的unicode码的高位和低位呼唤
for (i=0; b[i]!='\0'; i=i+4)
{
a[i]=b[i+2];
a[i+1]=b[i+3];
a[i+2]=b[i];
a[i+3]=b[i+1];
num=num+1;
}
printf("num=%d\n, %s\n", num, a);
for (i=0; i<4*num;i=i+2)
{
if (a[i]>='0'&&a[i]<='9')
{
e=(int)(a[i]);
printf("e=%d\n",e);
e=(int)(a[i])-48;
e=e<<4;
c1=e&0xf0;
}
if (a[i]>='A'&&a[i]<='F')
{
e=(int)(a[i])-55;
e=e<<4;
c1=e&0xf0;
}
if (a[i+1]>='0'&&a[i+1]<='9')
{
e=(int)(a[i+1])-48;
c2=e&0x0f;
}
if (a[i+1]>='A'&&a[i+1]<='F')
{
e=(int)(a[i+1])-55;
c2=e&0x0f;
}
c=c1|c2;
ff[i/2]=c;
printf("%d , ff=%x\n",i/2, ff[i/2]);
}
rc = u2g(ff,strlen(ff),out,OUTLEN);
printf(" fft=%s\n",out);
}
#define OUTLEN 255
#include <stdlib.h>
#include <stdio.h>
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int
outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("unicode","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","unicode",inbuf,inlen,outbuf,outlen);
}
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char unicode[4];
char *in_gb2312 = "一"; //“一”不知为什么出不来
char out[OUTLEN];
char out2[OUTLEN];
int rc;
int i;
char c,c1,c2;
int num=0;
int e;
char b[100]="4ECA5929661F671F4E00FF0C59296C144E0D95193002"; //今星期一,天气不错。
char a[100];
char ff[140];
char un[2];
un[0]=0x00; //“一”,4E00
un[1]=0x4E;
rc = u2g(un,strlen(un),out2,OUTLEN);
printf(" out2=%s\n",out2);
//unicode码转为gb2312码,转换Unicode顺序(如5BB6->B65B)。 今星期一,天气不错。
//下面代码是将单个字符串的unicode码的高位和低位呼唤
for (i=0; b[i]!='\0'; i=i+4)
{
a[i]=b[i+2];
a[i+1]=b[i+3];
a[i+2]=b[i];
a[i+3]=b[i+1];
num=num+1;
}
printf("num=%d\n, %s\n", num, a);
for (i=0; i<4*num;i=i+2)
{
if (a[i]>='0'&&a[i]<='9')
{
e=(int)(a[i]);
printf("e=%d\n",e);
e=(int)(a[i])-48;
e=e<<4;
c1=e&0xf0;
}
if (a[i]>='A'&&a[i]<='F')
{
e=(int)(a[i])-55;
e=e<<4;
c1=e&0xf0;
}
if (a[i+1]>='0'&&a[i+1]<='9')
{
e=(int)(a[i+1])-48;
c2=e&0x0f;
}
if (a[i+1]>='A'&&a[i+1]<='F')
{
e=(int)(a[i+1])-55;
c2=e&0x0f;
}
c=c1|c2;
ff[i/2]=c;
printf("%d , ff=%x\n",i/2, ff[i/2]);
}
rc = u2g(ff,strlen(ff),out,OUTLEN);
printf(" fft=%s\n",out);
}
#3
上面是我编的程序!
#4
可以這麼做unicode-->utf--->gb2312
試試看
試試看
#5
Arthur_()
mark是什么意思?
能详细点解释一下吗?
mark是什么意思?
能详细点解释一下吗?
#6
好的,我试一试看!
#7
我只是標記一下
因為我以前也用過iconv不過是gbk-utf的
後來移植時候不支持iconv
所有讓window那邊負責轉化所有的碼
因為我以前也用過iconv不過是gbk-utf的
後來移植時候不支持iconv
所有讓window那邊負責轉化所有的碼
#8
好像是这样:
现在的unicode码已经不再是以前的16位了, 而是31位
可以把整个码表分为两段
UCS2(双字节) 码值介于0x0000 - 0xFFFF之间
USC4(四字节) 码值介于0x10000 - 0x10FFFF之间(可以用utf8和utf16表示),
码值介于0x110000 - 0x7FFFFFFF之间(utf16无法表示)
你直接给iconv_open带入"unicode"参数是让他以utf16进行转码?
对iconv系列不太了解, 不过就我所知表示汉字(GB兼容)utf8是3字节,utf32是4字节
而只有utf16是两字节表示一个汉字的, 但是有几个码段是保留区域, 是不能直接拿来当作unicode码的....
看下这个:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节), 先假设一个u
u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位) 将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x110000的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
现在的unicode码已经不再是以前的16位了, 而是31位
可以把整个码表分为两段
UCS2(双字节) 码值介于0x0000 - 0xFFFF之间
USC4(四字节) 码值介于0x10000 - 0x10FFFF之间(可以用utf8和utf16表示),
码值介于0x110000 - 0x7FFFFFFF之间(utf16无法表示)
你直接给iconv_open带入"unicode"参数是让他以utf16进行转码?
对iconv系列不太了解, 不过就我所知表示汉字(GB兼容)utf8是3字节,utf32是4字节
而只有utf16是两字节表示一个汉字的, 但是有几个码段是保留区域, 是不能直接拿来当作unicode码的....
看下这个:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节), 先假设一个u
u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位) 将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x110000的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
#9
晕...
好像不是这个问题...
4E00调转字节后是004e
原字符被00截断, 将字符串带入后,转换到00就over了
好像不是这个问题...
4E00调转字节后是004e
原字符被00截断, 将字符串带入后,转换到00就over了
#10
rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen
不能用strlen
#11
我一會做下, 等等
我的是utf8-gdk2312-utf8
我的是utf8-gdk2312-utf8
#12
rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen
======
-_#
不能用strlen
======
-_#
#13
:目
#14
我的是utf8-gdk2312-utf8
我的都ok
我的都ok
#15
你的可以? 我去putty一下...
#16
恩, window那邊的做法是utf-unicode-gb2312
它發送給我信息時候也轉化gb2312-->unicode--gb2312
你的問題偶也不清楚, 不過很灌注
它發送給我信息時候也轉化gb2312-->unicode--gb2312
你的問題偶也不清楚, 不過很灌注
#17
你可以对utf8的文件做下预处理,把所有0x00换成0x20,然后就能用strlen了
#18
iconv()中的inbuf/outbuf参数不能理解为字符串, 它是个inlen/outlen/长度的buffer,
inlen指示buffer的字节数,不是字符串长度,更不能用strlen得到inlen/outlen
inlen指示buffer的字节数,不是字符串长度,更不能用strlen得到inlen/outlen
#19
不知道说的对不对,我这没linux没法试验, putty那边是solaris没iconv库...
#20
用这个main试一下:
int main(int argc, char *argv[]) {
int rc;
unsigned char gb_buf[256] = {};
unsigned short uni_buf[32] = { 0x4ECA,0x5929,0x661F,0x671F,0x4E00, //'今星期一'
0xFF0C, //','
0x5929,0x6C14,0x4E0D,0x9519, //'天气不错'
0x3002,0x0000 }; //'。\0'
printf("\nucs2 to gb2312: ");
if(rc = u2g(uni_buf, INLEN, gb_buf, OUTLEN)) {
printf("%s\n",out);
}else {
printf("faild(%d)\n", rc);
}
}
int main(int argc, char *argv[]) {
int rc;
unsigned char gb_buf[256] = {};
unsigned short uni_buf[32] = { 0x4ECA,0x5929,0x661F,0x671F,0x4E00, //'今星期一'
0xFF0C, //','
0x5929,0x6C14,0x4E0D,0x9519, //'天气不错'
0x3002,0x0000 }; //'。\0'
printf("\nucs2 to gb2312: ");
if(rc = u2g(uni_buf, INLEN, gb_buf, OUTLEN)) {
printf("%s\n",out);
}else {
printf("faild(%d)\n", rc);
}
}
#21
你只要記得windows上是utf-16(就是雙字節Unicode), liunx上是utf-8,這兩種都是unicode,但是編碼的方式不一樣。 然后再考慮你的轉換方法。
#22
mark
#23
wchar_t 在linux下是四字节的,
你可以试着在uni_buf尾部再添一个0x0000,这样串结束符就是0x00000000
这样 (wcslen((wchar_t)uni_buf)<<1)就是uni_buf中的长度了
你可以试着在uni_buf尾部再添一个0x0000,这样串结束符就是0x00000000
这样 (wcslen((wchar_t)uni_buf)<<1)就是uni_buf中的长度了
#24
mark
#25
抱歉, 上面的说错了, 现在更正一下:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;//模版0xD800和0xDC00又称代理对
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;//模版0xD800和0xDC00又称代理对
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
#26
额...再更正一下:
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 0xxxxxxx 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
1.unicode -> utf-8 编码:
unicode = 0xUUUUUUUU = xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
当0xUUUUUUUU码值在以下范围内时:
0x00000000 - 0x0000007F, utf8 = 0xxxxxxx 单字节
0x00000080 - 0x000007FF, utf8 = 110xxxxx 10xxxxxx 双字节
0x00000800 - 0x0000FFFF, utf8 = 1110xxxx 10xxxxxx 10xxxxxx 三字节
0x00010000 - 0x001FFFFF, utf8 = 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节
0x00200000 - 0x03FFFFFF, utf8 = 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 五字节
0x04000000 - 0x7FFFFFFF, utf8 = 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 六字节
2.unicode -> utf-16编码
unicode在以下范围内时:
0x0000 - 0xFFFF, 固定使用双字节, 即:
utf16 = unicode, 但unicode必须不是OxD800-0xDFFF之间的值;
0x10000 - 0x10FFFF, 使用两个双字节, 即双字(字=2字节, 这个双字又称为代理对)
先假设一个u = unicode - 0x10000 = xxxx xxxxxxxx xxxxxxxx,(20位)
将各位依次置入模板:
utf16 = 110110xxxxxxxxxx 110111xxxxxxxxxx;
大于0x10FFFF的unicode无法编码为utf16格式!!
3.unicode->utf-32
utf32 = unicode
.....
#27
Linux 环境下的多核调试
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Totalview Debugger 正是在这种情况下应运而生!
Intel软件可以在英特尔架构上产生出色的应用程序性能,并可以利用最新英特尔多核处理器的各项先进功能。TotalView Debugger与Intel软件的结合将会掀起一场linux下调试工具的革命!
TotalView Debugger是一个linux平台并行环境下的调试工具,它的IDE环境、多线程(进程)调试能力、内存调试能力、集群调试能力在业界都是无与伦比的!
XLsoft携手Intel、TotalView公司于2008年10月30日在上海举行“Linux 环境下的多核调试”免费培训讲座。我们非常荣幸地邀请您参加,并提供免费软件试用光盘!
一、报名方式:
电话:021-62128912/010-84492749
Email:Marketing@xlsoft.com.cn
二、讲座内容:
1. Linux 平台下程序调试工具概述
2. Intel 软件功能介绍
3. Totalview Debugger功能介绍
三、讲座时间:
2008年10月30日(星期四)14:00 ~ 17:00
四、讲座地点:
上海青松城大酒店3楼长悦厅
(徐家汇肇家浜路777号东安路口,距衡山路站约15分钟路程)
四、活动详情:
联系人:王娟
Tel:021-62128916 Mobile: 15000262606
E-mail:kiko.wang@xlsoft.com.cn
咨询热线:
021-62128912 010-84492749
更多的服务信息,请联系我们Marketing@xlsoft.com.cn or 联系方式。
上海世全软件信息技术有限公司
联系电话 上海:021-62128912 北京:010-84492749
— Intel + Totalview 强强联合!
目前,在软件开发行业,各种性能优异的调试工具层出不穷。但是,它们中的绝大部分都只支持windows环境。即使能支持linux平台,操作起来也很不方便。因此,对于长期在linux上编写程序的开发人员来说,如何调试就成了一个令人头痛的问题!Intel软件 和 Totalview Debugger 正是在这种情况下应运而生!
Intel软件可以在英特尔架构上产生出色的应用程序性能,并可以利用最新英特尔多核处理器的各项先进功能。TotalView Debugger与Intel软件的结合将会掀起一场linux下调试工具的革命!
TotalView Debugger是一个linux平台并行环境下的调试工具,它的IDE环境、多线程(进程)调试能力、内存调试能力、集群调试能力在业界都是无与伦比的!
XLsoft携手Intel、TotalView公司于2008年10月30日在上海举行“Linux 环境下的多核调试”免费培训讲座。我们非常荣幸地邀请您参加,并提供免费软件试用光盘!
一、报名方式:
电话:021-62128912/010-84492749
Email:Marketing@xlsoft.com.cn
二、讲座内容:
1. Linux 平台下程序调试工具概述
2. Intel 软件功能介绍
3. Totalview Debugger功能介绍
三、讲座时间:
2008年10月30日(星期四)14:00 ~ 17:00
四、讲座地点:
上海青松城大酒店3楼长悦厅
(徐家汇肇家浜路777号东安路口,距衡山路站约15分钟路程)
四、活动详情:
联系人:王娟
Tel:021-62128916 Mobile: 15000262606
E-mail:kiko.wang@xlsoft.com.cn
咨询热线:
021-62128912 010-84492749
更多的服务信息,请联系我们Marketing@xlsoft.com.cn or 联系方式。
上海世全软件信息技术有限公司
联系电话 上海:021-62128912 北京:010-84492749
#28
mark
#29
哥们 可以查表转码制的。。。。。。。。