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までの符号化方式は以下の通りである.
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;
}
}