Click here to Skip to main content
15,887,333 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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
-----------------------------------------------------------------------------------------
C++
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
-----------------------------------------------------------------------------------------------------
C#
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;
}
Posted
Updated 17-Sep-12 20:26pm
v2
Comments
Jochen Arndt 18-Sep-12 3:12am    
The code you found and tried to convert may be not what you want (it converts to UTF-8 encoded quoted-printable strings).

You should also supply more information about the operating system and the encodings to be converted from/to UTF-8.

1 solution

 
Share this answer
 
Comments
younwoo 18-Sep-12 2:26am    
thanks. ^^

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900