c 求GBK编码,UTF-8编码

时间:2023-01-05 10:23:45
希望用标准c实现
不是GBK转到UTF-8哦
是求一个汉字的GBK编码或者UTF-8
例如啊的GBK编码是BOA1
不知道如何实现

16 个解决方案

#1


要么用系统的api要么用iconv。

C标准库没这个东西。

#2


没人知道吗

#3


引用 2 楼 realminmin 的回复:
没人知道吗

1楼答案已经很清楚了。

如果crt没有的就不算标准C,那就自己写吧。

#4


iconv函数我看过了,但是我看了好多例子都不明白如何达到这样的效果
cd = iconv_open(to_charset,from_charset);
iconv(cd,pin,&inlen,pout,&outlen)

pin="啊"的时候
保证输出pout等于BOA1
谁能给我个例子呢?
输入字符串"啊"
输出 BOA1呢

#5


在OS上,通常会有一种默认内码.所有的字符都按这种内码来编码.
比如win32上,如果使用MBCS字符时会按语言选择当地的默认内码,比如简体中文使用GB2312编码.使用宽字符时则是UTF16编码.而UTF8只是UCS的一种表达形式,可以很简单的从UTF16转换得到.
而在linux上,现在多使用utf8做为系统默认内码.
楼主所要的就是这些字符的"值"而已.
所以你只要把输入转到相应的内码,然后给出这个字符的值就可以了.
如:
unsigned char s[] = "啊";
printf( "%02X%02X", s[0], s[1] ); // 输出B0A1

#6


引用 4 楼 realminmin 的回复:
iconv函数我看过了,但是我看了好多例子都不明白如何达到这样的效果
cd = iconv_open(to_charset,from_charset);
iconv(cd,pin,&inlen,pout,&outlen)

pin="啊"的时候
保证输出pout等于BOA1
谁能给我个例子呢?
输入字符串"啊"
输出 BOA1呢

难道你要的是这个 ?

int main()
{
char xx[]="啊";
printf( "%x%x" , (unsigned char)xx[0] , (unsigned char)xx[1] );
}

#7


对哦,GBK我要的就是这个,UTF-8怎么实现呢?

#8


我用的是linux 系统我看了下默认编码的确是UTF-8

#9



int main ()
{
  char xx[] = "啊";
  printf ("%x%x%x", (unsigned char) xx[0], (unsigned char) xx[1], (unsigned char) xx[2] );  
}

分别用 -fexec-charset=utf-8
-fexec-charset=gbk
这两个编译选项试试结果

#10


在linux 上我用你的程序这样编译gcc -g encode.c -fexec-charset=utf-8 -o encode
输出结果:
b0a10
郁闷哦,怎么不是UTF-8呢

#11


这样呢
iconv -fgbk -tutf-8 encode.c > encode_utf8.c
gcc encode_utf8.c -o encode_utf8

#12


学习了

#13


不是GBK转到UTF-8哦
是求一个汉字的GBK编码或者UTF-8
====
这有区别吗?

#14


先算一个汉字UTF8码占几个字节:
int Count( char *buf)/*计算UTF8汉字占几个字节*/
{
    char ptr;
    int num = 0;
    char temp = 0x80;
    
    ptr = buf[0];
    while(temp & ptr)
    {
     num++;
ptr<<=1; 
    }
    if(num == 0)
     num = 1;
    return num;
}

算出一个UTF8字后 剩下的就是将buf的num个字节转化成16进制输出来就行了

#15



GBK→Unicode→UTF8
0xB0A1→0x554A→0xE5958A

#16


后来自己解决了

#1


要么用系统的api要么用iconv。

C标准库没这个东西。

#2


没人知道吗

#3


引用 2 楼 realminmin 的回复:
没人知道吗

1楼答案已经很清楚了。

如果crt没有的就不算标准C,那就自己写吧。

#4


iconv函数我看过了,但是我看了好多例子都不明白如何达到这样的效果
cd = iconv_open(to_charset,from_charset);
iconv(cd,pin,&inlen,pout,&outlen)

pin="啊"的时候
保证输出pout等于BOA1
谁能给我个例子呢?
输入字符串"啊"
输出 BOA1呢

#5


在OS上,通常会有一种默认内码.所有的字符都按这种内码来编码.
比如win32上,如果使用MBCS字符时会按语言选择当地的默认内码,比如简体中文使用GB2312编码.使用宽字符时则是UTF16编码.而UTF8只是UCS的一种表达形式,可以很简单的从UTF16转换得到.
而在linux上,现在多使用utf8做为系统默认内码.
楼主所要的就是这些字符的"值"而已.
所以你只要把输入转到相应的内码,然后给出这个字符的值就可以了.
如:
unsigned char s[] = "啊";
printf( "%02X%02X", s[0], s[1] ); // 输出B0A1

#6


引用 4 楼 realminmin 的回复:
iconv函数我看过了,但是我看了好多例子都不明白如何达到这样的效果
cd = iconv_open(to_charset,from_charset);
iconv(cd,pin,&amp;inlen,pout,&amp;outlen)

pin="啊"的时候
保证输出pout等于BOA1
谁能给我个例子呢?
输入字符串"啊"
输出 BOA1呢

难道你要的是这个 ?

int main()
{
char xx[]="啊";
printf( "%x%x" , (unsigned char)xx[0] , (unsigned char)xx[1] );
}

#7


对哦,GBK我要的就是这个,UTF-8怎么实现呢?

#8


我用的是linux 系统我看了下默认编码的确是UTF-8

#9



int main ()
{
  char xx[] = "啊";
  printf ("%x%x%x", (unsigned char) xx[0], (unsigned char) xx[1], (unsigned char) xx[2] );  
}

分别用 -fexec-charset=utf-8
-fexec-charset=gbk
这两个编译选项试试结果

#10


在linux 上我用你的程序这样编译gcc -g encode.c -fexec-charset=utf-8 -o encode
输出结果:
b0a10
郁闷哦,怎么不是UTF-8呢

#11


这样呢
iconv -fgbk -tutf-8 encode.c > encode_utf8.c
gcc encode_utf8.c -o encode_utf8

#12


学习了

#13


不是GBK转到UTF-8哦
是求一个汉字的GBK编码或者UTF-8
====
这有区别吗?

#14


先算一个汉字UTF8码占几个字节:
int Count( char *buf)/*计算UTF8汉字占几个字节*/
{
    char ptr;
    int num = 0;
    char temp = 0x80;
    
    ptr = buf[0];
    while(temp & ptr)
    {
     num++;
ptr<<=1; 
    }
    if(num == 0)
     num = 1;
    return num;
}

算出一个UTF8字后 剩下的就是将buf的num个字节转化成16进制输出来就行了

#15



GBK→Unicode→UTF8
0xB0A1→0x554A→0xE5958A

#16


后来自己解决了