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