UTF8轉換為GB編碼gb2312轉換為utf-8

來源:互聯網
上載者:User
這個方法是用windows的字元集轉換的,跟sybase
的unicode碼錶可能在某些符號上有差別,對於大部分字元來說,尤其是
漢字,應該不會有問題的,如果要求比較高的話,可以買sybase的
unicode開發包,:P
[code]
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <locale.h>

#include <ctype.h>

#include <mbstring.h>

size_t mbstoutf8(unsigned char* utf, unsigned char* mbs)

{

size_t mbl = 0;

size_t wcneed = mbstowcs(NULL, mbs, mbl);

wchar_t* wc = NULL;

size_t u8need = 0;

wchar_t* wp = NULL;

mbl = _mbslen(mbs);

wcneed = mbstowcs(NULL, mbs, mbl);

wc= calloc(wcneed + 1, sizeof(wchar_t));

if (!wc)

return -1;

if (mbstowcs(wc, mbs, mbl) < mbl)

return -1;

wc[mbl] = L'\0';

wp = wc;

if (!utf)

{

while (*wp)

{

if ((*wp & 0x7f) == *wp)

u8need += 1;

else if ((*wp & 0x7ff) == *wp)

u8need += 2;

else

u8need +=3;

*wp++;

}

}

else

{

while (*wp)

{

if ((*wp & 0x7f) == *wp)

{

*utf++ = *wp & 0x7f;

u8need += 1;

}

else if ((*wp & 0x7ff) == *wp)

{

*utf++ = 0xc0 | (*wp >> 6);

*utf++ = 0x80 | (*wp & 0x3f);

u8need += 2;

}

else

{

*utf++ = 0xe0 | (*wp >> 12);

*utf++ = 0x80 | ((*wp >> 6) & 0x3f);

*utf++ = 0x80 | (*wp & 0x3f);

u8need += 3;

}

*wp++;

}

*utf = 0;

}

free(wc);

return u8need;

}

int main(void)

{

char mbs[81];

size_t sz = 0;

setlocale(LC_CTYPE, ".936");

for (; ; )

{

fgets(mbs, 80, stdin);

mbs[strlen(mbs) - 1] = '\0';

if (!*mbs)

break;

sz = mbstoutf8(NULL, mbs);

if (sz != -1)

{

char* u = malloc(sz + 1);

if (u)

{

mbstoutf8(u, mbs);

puts(u);

free(u);

}

}

}

return 0;

}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <ctype.h>
#include <mbstring.h>
#include <wchar.h>
size_t utf8tombs(unsigned char* mbs, wchar_t* utf)
{
size_t wcl = 0;
size_t mbneed = wcstombs(NULL, utf, wcl);
char* mc = NULL;
size_t gbneed = 0;
char* mp = NULL;
wcl = wcslen(utf);
gbneed = wcstombs(NULL, utf, wcl);
mc= calloc(gbneed + 1, sizeof(unsigned char));
if (!mc)
return -1;
if (wcstombs(mc, utf, wcl) < wcl)
return -1;
mc[wcl] = '\0';
mp = mc;
if (!mbs)
{
while (*mp)
{
if ((*mp & 0x80) == *mp)
gbneed += 1;
else if ((*mp & 0x800) == *mp)
gbneed += 2;
else
gbneed +=3;
*mp++;
}
}
else
{
while (*mp)
{
if ((*mp & 0x80) == *mp)
{
*mbs++ = *mp & 0x80;
gbneed += 1;
}
else if ((*mp & 0x800) == *mp)
{
*mbs++ = 0x3f | (*mp << 6);
*mbs++ = 0x7f | (*mp & 0xc0);

gbneed += 2;
}
else
{
*mbs++ = 0x1f | (*mp << 12);
*mbs++ = 0x7f | ((*mp << 6) & 0xc0);
*mbs++ = 0x7f | (*mp & 0xc0);
gbneed += 3;
}
*mp++;
}
*mbs = 0;
}
free(mc);
return gbneed;
}
int main(void)
{
char utf[81];
size_t sz = 0;
setlocale(LC_CTYPE, ".936");
for (; ; )
{
fgets(utf, 80, stdin);
utf[strlen(utf) - 1] = '\0';
if (!*utf)
break;
sz = utf8tombs(NULL, utf);
if (sz != -1)
{
char* u = malloc(sz + 1);
if (u)
{
utf8tombs(u, utf);
puts(u);
free(u);
}
}
}
return 0;
} [/code]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.