UTF8转GB2312

1.UTF-8先到UNICODE

int UTF82UCS(unsigned char *pUTF8, wchar_t *pUCS)
{
	int UCSlen = 0, i;
	unsigned char *pTempUCS = NULL;
	unsigned char *pTempUTF8 = NULL;

	if(pUCS == NULL || pUTF8 == NULL)
		return -1;
	UCSlen = MultiByteToWideChar(CP_UTF8,0,(LPCSTR)pUTF8,-1,NULL,0);
	UCSlen--;
	pTempUCS = (unsigned char*)pUCS;
	pTempUTF8 = pUTF8;
	for(i = 0; i < UCSlen; i++)
	{
		if((*pTempUTF8) <= 0x7F)  //1 byte
		{
			*(pTempUCS + 1) = 0x00;
			*pTempUCS = *(pTempUTF8++);
			pTempUCS += 2;
		}
		else if((*pTempUTF8) >= 0xC0 && (*pTempUTF8) <= 0xDF)//2 bytes
		{
			*(pTempUCS + 1) = ((*pTempUTF8) >> 2) & 0x07;
			*pTempUCS = ((*pTempUTF8) << 6) | (*(pTempUTF8 + 1) & 0x3F);
			pTempUTF8 += 2;
			pTempUCS += 2;
		}
		else//3 bytes
		{
			*(pTempUCS + 1) = ((*pTempUTF8) << 4) | ((*(pTempUTF8 + 1) >> 2) & 0x0F);
			pTempUTF8++;
			*pTempUCS = ((*pTempUTF8) << 6) | (*(pTempUTF8+1) & 0x3F);
			pTempUTF8 += 2;
			pTempUCS += 2;
		}
	}
	return UCSlen;
}

2.UNICODE到GB2312

void UnicodeToGB2312(char* pOut,wchar_t* uData,int nLen)
{
	WideCharToMultiByte(CP_ACP,NULL,uData,nLen,pOut,sizeof(wchar_t)*nLen,NULL,NULL);
	return;
}      



完整的例子

wchar_t pUnicode[128]= {0};
				char pGB2312[256]= {0};
				int nUnicodeLen = UTF82UCS((unsigned char *)pUtf8,(wchar_t*)pUnicode);

				UnicodeToGB2312((char*)&pGB2312,(wchar_t*)&pUnicode,nUnicodeLen);

				


在Delphi 7中,将字符串从UTF-8转换GB2312可以通过使用Delphi的内置函数和单元来实现。Delphi 7虽然没有直接支持UTF-8到GB2312转换: ```delphi uses SysUtils, Classes, Windows; function UTF8ToGB2312(const UTF8Str: UTF8String): AnsString; var UTF8Len, GBLen, TempLen: Integer; UTF8Buf: PAnsiChar; GBBuf: array[0..65535] of Byte; begin // 计算UTF-8编码字符串的字节数组长度 UTF8Len := Length(UTF8Str); if UTF8Len = 0 then begin Result := ''; Exit; end; // 获取指向UTF-8编码字符串的指针 UTF8Buf := PAnsiChar(UTF8Str); // 初始化目标字符串的长度 GBLen := 0; // 转换过程 repeat // 调用Windows API函数MultiByteToWideChar进行转换 TempLen := MultiByteToWideChar(CP_UTF8, 0, UTF8Buf, UTF8Len, nil, 0); Inc(GBLen, TempLen); Inc(UTF8Len, UTF8Len - StrLen(UTF8Buf)); // 更新UTF-8字符串的剩余长度 if GBLen < 0 then begin Result := ''; Exit; end; // 分配足够的空间来存放转换后的字符串 SetLength(Result, GBLen); // 再次调用Windows API函数MultiByteToWideChar进行转换 if not MultiByteToWideChar(CP_UTF8, 0, UTF8Buf, UTF8Len, PWideChar(Result), GBLen) then begin Result := ''; Exit; end; // 将宽字符串转换GB2312编码的ANSI字符串 GBLen := WideCharToMultiByte(CP_ACP, 0, PWideChar(Result), -1, nil, 0, nil, nil); if GBLen <= 0 then begin Result := ''; Exit; end; SetLength(Result, GBLen); // 这次调用会完成最终的转换 if not WideCharToMultiByte(CP_ACP, 0, PWideChar(Result), -1, PAnsiChar(Result), GBLen, nil, nil) then begin Result := ''; Exit; end; until UTF8Len <= 0; end; ``` 在上述代码中,我们首先定义了一个函数`UTF8ToGB2312`,该函数接受一个UTF-8编码的字符串作为输入,并返回一个GB2312编码的字符串。函数中使用了Windows API函数`MultiByteToWideChar`和`WideCharToMultiByte`来完成编码转换。 需要注意的是,这个过程依赖于Windows系统的多字节和宽字节字符处理能力,因为Delphi 7本身并不直接支持从UTF-8到GB2312转换。此示例代码可能需要根据实际情况进行调整以确保正确的执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值