UNICコード回転UTF 8

2006 ワード

正確に言えばここのUNICODコードはUCS 2コードを指しており、Windowsアプリケーションで使用されているwchar_を開発しています.t型配列に格納されている文字はUCS 2符号化されるべきであり,UNICodeが2バイト符号化されていると勘違いされやすい.実はUNICodeは1種の文字のセットを代表して、つまり文字の符号化の方案で、それはただ記号のバイナリコードだけを規定して、このバイナリコードがどのようにコンピュータの上で記憶するべきなことを規定していないで、UTF 8、UTF 16、UCS 2これらの符号化の方式はUNICodeの各種の実現の方式で、UNICodeのバイナリコードのコンピュータの表現の方式を規定しました.また、UCS 2符号化は、UNICコード文字セットを完全に表すものではない.
UCS 2からUTF-8までの符号化方式は以下の通りである.
/*
 :
strUnicode		: Unicode 
strUnicodeLen	: Unicode 
strUTF8			: UTF8 
strUTF8Len		: UTF8 , , -1.

 			:  UTF8 , -1  
*/
int UnicodeToUTF_8(wchar_t *strUnicode, int strUnicodeLen, char *strUTF8, int strUTF8Len)
{
	if((strUnicode == NULL) || (strUnicodeLen <= 0) || (strUTF8Len <= 0 && strUTF8Len != -1))
	{
		return -1;
	}

	int i, offset = 0;

	if(strUTF8Len == -1)
	{
		for(i = 0; i < strUnicodeLen; i++)
		{
			if(strUnicode[i] <= 0x007f)		// 
			{
				offset += 1;
			}
			else if(strUnicode[i] >= 0x0080 && strUnicode[i] <= 0x07ff)	// 
			{
				offset += 2;
			}
			else if(strUnicode[i] >= 0x0800 && strUnicode[i] <= 0xffff)	// 
			{	
				offset += 3;
			}
		}
		return offset + 1;
	}
	else
	{
		if(strUTF8 == NULL)
		{
			return -1;
		}

		for(i = 0; i < strUnicodeLen; i++)
		{
			if(strUnicode[i] <= 0x007f)		// 
			{
				strUTF8[offset++] = (char)(strUnicode[i] & 0x007f);
			}
			else if(strUnicode[i] >= 0x0080 && strUnicode[i] <= 0x07ff)	// 
			{
				strUTF8[offset++] = (char)(((strUnicode[i] & 0x07c0) >> 6) | 0x00c0);
				strUTF8[offset++] = (char)((strUnicode[i] & 0x003f) | 0x0080);
			}
			else if(strUnicode[i] >= 0x0800 && strUnicode[i] <= 0xffff)	// 
			{
				strUTF8[offset++] = (char)(((strUnicode[i] & 0xf000) >> 12) | 0x00e0);
				strUTF8[offset++] = (char)(((strUnicode[i] & 0x0fc0) >> 6) | 0x0080);
				strUTF8[offset++] = (char)((strUnicode[i] & 0x003f) | 0x0080);
			}
		}
		strUTF8[offset] = '\0';
		return offset + 1;
	}
}