首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

linux兑现unicode和utf8之间的转码

2013-03-14 
linux实现unicode和utf8之间的转码用iconv的话参数要如何设置?utf-16 utf-8 ???还有iconv 参数是char *,用

linux实现unicode和utf8之间的转码
用iconv的话参数要如何设置?utf-16 utf-8 ???
还有iconv 参数是char *,用fgets从UNICODE编码的文件中读取出来内容
因为UNICODE一个字符占用两个字节,如果是ascII码字符的话就有一个字节是0
这样后面的字符就不会再处理了

linux 到底是如何实现UNICODE到UTF8的转码?

[解决办法]
http://lingchuangsong.blog.163.com/blog/static/12693232201062754846389/

这里讲的比较清楚了!可以自己实现代码转换

至于转换BOOST库里不知道有没有标准库函数可以用,等楼下的解释吧
[解决办法]
俺比较喜欢用iconv解决这类问题,下面的代码供参考。


#pragma comment(lib,"iconv.lib")
 
// - - - - - - - 以下是在Linux上实现的字符集转换函数
int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,char *outbuf, size_t outlen)
{
         iconv_t cd;
         const 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;
}

/* UTF-8 to UTF-16  */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
         return code_convert("UTF-8","UTF-16",inbuf,inlen,outbuf,outlen);
}
 
/* UTF-16 to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
         return code_convert("UTF-16", "UTF-8", inbuf, inlen, outbuf, outlen);
}
// - - - - - - - 以上是在Linux上实现的字符集转换函数

[解决办法]
void ansitoUnicode( char* ansiStr, int ansiStrLen, char* unicodeStr, int* unicodeStrLen )
{
     int i = 0;
     while( i < ansiStrLen )
     {
*( unicodeStr + 2*i ) = 0x00;
*( unicodeStr + 2*i + 1 ) = *( ansiStr + i );
printf( "out %dth: %d   %dth: %d\n ", 2*i, *( unicodeStr + 2*i ), 2*i+1, *( unicodeStr + 2*i + 1 ) );
i++;
     }     

    if( NULL != unicodeStrLen )
    {
    *unicodeStrLen = 2*ansiStrLen;
    }
}

void unicodeToansi( char* unicodeStr, int unicodeStrLen, char* ansiStr, int *ansiStrLen )
{
    int i = 0;


    while( i < unicodeStrLen/2 )
    {
    *( ansiStr + i ) = *( unicodeStr + 2*i + 1 );
    ++i;
    } 

    if( NULL != ansiStrLen )
    {
        *ansiStrLen = unicodeStrLen/2;
    }
}



这我写的转换代码,看能用不
[解决办法]
size_t inBytes = strlen(szBuffer); strlen是char*类型的,遇到0x0就结束了。unicode中,可能遇到某个字符中的一个0x0字节就提前结束了。
fgetws 这个是宽字符版本的读取。wcslen是strlen的宽字符版。
不过windows下用的是UCS-2每个2字节,linux USC-4 wchar_t每个4字节。是否能正确读取,我就不清楚了。

热点排行