具有C语言的文本转换UTF-8 [英] text conversion UTF-8 with c-language

查看:116
本文介绍了具有C语言的文本转换UTF-8的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨.
我是日本学生.

我制作果酱游戏项目.

我有关于文本转换(到UTF8或从UTF8转换)的问题.

您有使用c语言的解决方案吗?

很感谢. :)

ps.我使功能-仅C版本

原始代码
-------------------------------------------------- ---------------------------------------

hi.
i am jap student.

i make marmalade game project.

i have problem about Text Conversion ( to/from UTF8 ).

do you have solution with c-language?

very thanks. :)

ps. i make function - only c version

original code
-----------------------------------------------------------------------------------------

CString EncodeToUTF8(LPCTSTR szSource)
{
	WORD ch;

	BYTE bt1, bt2, bt3, bt4, bt5, bt6;

	int n, nMax = _tcslen(szSource);

	CString sFinal, sTemp;

	for (n = 0; n < nMax; ++n)
	{
		ch = (WORD)szSource[n];

		if (ch == _T('='))
		{
			sTemp.Format(_T("=%02X"), ch);

			sFinal += sTemp;
		}
		else if (ch < 128)
		{
			sFinal += szSource[n];
		}
		else if (ch <= 2047)
		{
			bt1 = (BYTE)(192 + (ch / 64));
			bt2 = (BYTE)(128 + (ch % 64));

			sTemp.Format(_T("=%02X=%02X"), bt1, bt2);

			sFinal += sTemp;
		}
		else if (ch <= 65535)
		{
			bt1 = (BYTE)(224 + (ch / 4096));
			bt2 = (BYTE)(128 + ((ch / 64) % 64));
			bt3 = (BYTE)(128 + (ch % 64));

			sTemp.Format(_T("=%02X=%02X=%02X"), bt1, bt2, bt3);

			sFinal += sTemp;
		}
		else if (ch <= 2097151)
		{
			bt1 = (BYTE)(240 + (ch / 262144));
			bt2 = (BYTE)(128 + ((ch / 4096) % 64));
			bt3 = (BYTE)(128 + ((ch / 64) % 64));
			bt4 = (BYTE)(128 + (ch % 64));

			sTemp.Format(_T("=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4);
			sFinal += sTemp;
		}
		else if (ch <=67108863)
		{
			bt1 = (BYTE)(248 + (ch / 16777216));
			bt2 = (BYTE)(128 + ((ch / 262144) % 64));
			bt3 = (BYTE)(128 + ((ch / 4096) % 64));
			bt4 = (BYTE)(128 + ((ch / 64) % 64));
			bt5 = (BYTE)(128 + (ch % 64));

			sTemp.Format(_T("=%02X=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4, bt5);
			sFinal += sTemp;
		}
		else if (ch <=2147483647)
		{
			bt1 = (BYTE)(252 + (ch / 1073741824));
			bt2 = (BYTE)(128 + ((ch / 16777216) % 64));
			bt3 = (BYTE)(128 + ((ch / 262144) % 64));
			bt4 = (BYTE)(128 + ((ch / 4096) % 64));
			bt5 = (BYTE)(128 + ((ch / 64) % 64));
			bt6 = (BYTE)(128 + (ch % 64));

			sTemp.Format(_T("=%02X=%02X=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4, bt5, bt6);
			sFinal += sTemp;
		}

	}

	return sFinal;
}



我的代码
-------------------------------------------------- -------------------------------------------------- -



my code
-----------------------------------------------------------------------------------------------------

int EndcodeToUTF8(const char * szSource , unsigned short *UniCodeString)
{
    int returnValue = -1;

    unsigned short ch;

    unsigned char bt1, bt2, bt3, bt4, bt5, bt6;

    int n, nMax = strlen(szSource);

    char testStr[100];
    strcpy(testStr,"테스트");
    n = nMax = strlen(testStr);

    char fStr[900];
    memset(fStr,0,900);

//  int8 * fStr = (uint8*)UniCodeString;

    char str[900];
    unsigned short *sTemp;

    for (n = 0; n < nMax; ++n)
    {
//      ch = (unsigned short)szSource[n];
        ch = (unsigned short)testStr[n];

        if ( ch == '=' )
        {

            sprintf( str , "=%02X" , ch );

            strcat(fStr,str);

        }
        else if (ch < 128)
        {

            sprintf( str , "%c" , szSource[n] );

            strcat(fStr,str);
        }
        else if (ch <= 2047)
        {
            bt1 = (unsigned char)(192 + (ch / 64));
            bt2 = (unsigned char)(128 + (ch % 64));


            sprintf( str , "=%02X=%02X" , bt1, bt2);

            strcat(fStr,str);
        }
        else if (ch <= 65535)
        {
            bt1 = (unsigned char)(224 + (ch / 4096));
            bt2 = (unsigned char)(128 + ((ch / 64) % 64));
            bt3 = (unsigned char)(128 + (ch % 64));


            sprintf( str , "=%02X=%02X=%02X" , bt1, bt2, bt3);

            strcat(fStr,str);
        }
        else if (ch <= 2097151)
        {
            bt1 = (unsigned char)(240 + (ch / 262144));
            bt2 = (unsigned char)(128 + ((ch / 4096) % 64));
            bt3 = (unsigned char)(128 + ((ch / 64) % 64));
            bt4 = (unsigned char)(128 + (ch % 64));


            sprintf( str ,"=%02X=%02X=%02X=%02X" ,bt1, bt2, bt3, bt4);
            strcat(fStr,str);
        }
        else if (ch <=67108863)
        {
            bt1 = (unsigned char)(248 + (ch / 16777216));
            bt2 = (unsigned char)(128 + ((ch / 262144) % 64));
            bt3 = (unsigned char)(128 + ((ch / 4096) % 64));
            bt4 = (unsigned char)(128 + ((ch / 64) % 64));
            bt5 = (unsigned char)(128 + (ch % 64));

            sprintf( str ,"=%02X=%02X=%02X=%02X=%02X" ,bt1, bt2, bt3, bt4, bt5);

            strcat(fStr,str);
        }
        else if (ch <=2147483647)
        {
            bt1 = (unsigned char)(252 + (ch / 1073741824));
            bt2 = (unsigned char)(128 + ((ch / 16777216) % 64));
            bt3 = (unsigned char)(128 + ((ch / 262144) % 64));
            bt4 = (unsigned char)(128 + ((ch / 4096) % 64));
            bt5 = (unsigned char)(128 + ((ch / 64) % 64));
            bt6 = (unsigned char)(128 + (ch % 64));

            sprintf( str ,"=%02X=%02X=%02X=%02X=%02X=%02X" ,bt1, bt2, bt3, bt4, bt5, bt6);

            strcat(fStr,str);
        }
    }

    return returnValue;
}

推荐答案

从此处开始:

这篇关于具有C语言的文本转换UTF-8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆