Linux下unicode转GB2312问题

时间:2021-11-28 20:19:40
我是用Linux下,用c编的,包含#include <iconv.h>
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);
}

#3


上面是我编的程序!

#4


可以這麼做unicode-->utf--->gb2312

試試看

#5


Arthur_()
mark是什么意思?
能详细点解释一下吗?

#6


好的,我试一试看!

#7


我只是標記一下

因為我以前也用過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

.....




#9


晕...
好像不是这个问题...

4E00调转字节后是004e
原字符被00截断, 将字符串带入后,转换到00就over了

#10


rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen

#11


我一會做下, 等等

我的是utf8-gdk2312-utf8

#12


rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen

======


-_#

#13


:目

#14


我的是utf8-gdk2312-utf8


我的都ok

#15


你的可以? 我去putty一下...

#16


恩, window那邊的做法是utf-unicode-gb2312
它發送給我信息時候也轉化gb2312-->unicode--gb2312


你的問題偶也不清楚, 不過很灌注

#17


你可以对utf8的文件做下预处理,把所有0x00换成0x20,然后就能用strlen了

#18


iconv()中的inbuf/outbuf参数不能理解为字符串, 它是个inlen/outlen/长度的buffer,
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);
    }
}

#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中的长度了

#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

.....

#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

.....

#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

#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);
}

#3


上面是我编的程序!

#4


可以這麼做unicode-->utf--->gb2312

試試看

#5


Arthur_()
mark是什么意思?
能详细点解释一下吗?

#6


好的,我试一试看!

#7


我只是標記一下

因為我以前也用過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

.....




#9


晕...
好像不是这个问题...

4E00调转字节后是004e
原字符被00截断, 将字符串带入后,转换到00就over了

#10


rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen

#11


我一會做下, 等等

我的是utf8-gdk2312-utf8

#12


rc = u2g(ff,strlen(ff),out,OUTLEN);
不能用strlen

======


-_#

#13


:目

#14


我的是utf8-gdk2312-utf8


我的都ok

#15


你的可以? 我去putty一下...

#16


恩, window那邊的做法是utf-unicode-gb2312
它發送給我信息時候也轉化gb2312-->unicode--gb2312


你的問題偶也不清楚, 不過很灌注

#17


你可以对utf8的文件做下预处理,把所有0x00换成0x20,然后就能用strlen了

#18


iconv()中的inbuf/outbuf参数不能理解为字符串, 它是个inlen/outlen/长度的buffer,
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);
    }
}

#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中的长度了

#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

.....

#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

.....

#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

#28


mark

#29


哥们 可以查表转码制的。。。。。。。。