您的位置:首页 > 编程语言 > C语言/C++

C++中Unicode (Big-Endian)和Unicode的相互转换

2012-04-14 15:31 330 查看

关于字节序的大端小端在这里不再阐述, 作者假定读者已经了解其中编码原理, 贴代码(详细见RLIB源码, 实现简单):

typedef __declspec(align(1)) struct WCHARStruct
{
	CHAR High;
	CHAR Low;
}*PWCHARStruct;


To Unicode (Big-Endian):

if (codepage == Text::UTF16FEncoding::CodePage)
	{
		MemoryStream *pUtf16F = new MemoryStream(length * sizeof(WCHAR));
		//替换高低两位
		auto   pUtf16FData = (WCHAR *)pUtf16F->ObjectData, pUtf16Data = (WCHAR *)src;

		pUtf16F->Length = length * sizeof(WCHAR);//bytes
		length--;//基址by 0

		while(length >= 0)
		{
			((PWCHARStruct)(&pUtf16FData[length]))->High = 
				((PWCHARStruct)(&pUtf16Data[length]))->Low;
			((PWCHARStruct)(&pUtf16FData[length]))->Low = 
				((PWCHARStruct)(&pUtf16Data[length]))->High;
			length--;
		}
		return pUtf16F;
	} //if


To Unicode:

if (codepage == Text::UTF16FEncoding::CodePage)
	{
		MemoryStream *pUtf16 = new MemoryStream(length);
		//替换高低两位
		auto   pUtf16Data = (WCHAR *)pUtf16->ObjectData, pUtf16FData = (WCHAR *)src;

		if ((length % 2) != 0)
		{ 
			length--;//数据丢失?
			assert(!"不合法的数据长度");
		}
		pUtf16->Length = length;//bytes
		(length /= 2)--;//WCHAR size = 2, 基址by 0

		while(length >= 0)
		{
			((PWCHARStruct)(&pUtf16Data[length]))->High = 
				((PWCHARStruct)(&pUtf16FData[length]))->Low;
			((PWCHARStruct)(&pUtf16Data[length]))->Low = 
				((PWCHARStruct)(&pUtf16FData[length]))->High;
			length--;
		}
		return pUtf16;
	} //if
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: