⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unicode.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/


/*****************************************************
文件说明:unicode 转换
版本号:1.0.0
开发时期:2003-05-16
作者:李林
修改记录:
******************************************************/

#include <eframe.h>
#include <estring.h>
#include <enls.h>
#include "unicode.h"

typedef struct _CODE_PAGE_INFO
{
	UINT uiCodePageID;
	DWORD dwcpHandle;
	const CODE_PAGE_DRV * pCodePageDrv;
}CODE_PAGE_INFO, * PCODE_PAGE_INFO;

extern const CODE_PAGE_DRV gb2312Drv;
extern const CODE_PAGE_DRV utf8Drv;

static CODE_PAGE_INFO cpTable[] = 
{
	{ CP_GB2312, 1, &gb2312Drv },
	{ CP_UTF8, 1, &utf8Drv },
	{ 0 , 0 }
};

// ********************************************************************
//声明:PCODE_PAGE GetCodePage( UINT uiCodePage )
//参数:
//	IN uiCodePage - 代码页
//返回值:
//	代码表
//功能描述:根据代码页得到对应的代码表
//引用: 
// ********************************************************************

static const CODE_PAGE_INFO * GetCodePage( UINT uiCodePage )
{
	int i;
	PCODE_PAGE_INFO pcp = cpTable;

	for( i = 0; i < sizeof( cpTable ) / sizeof( CODE_PAGE_INFO ); i++, pcp++ )
	{
		if( pcp->uiCodePageID == uiCodePage )
			return pcp;
	}
	return NULL;
}


// ********************************************************************
//声明:int WinCP_MultiByteToWideChar( UINT uiCodePage,
//                               DWORD dwFlags,
//                               LPCSTR lpMultiByteStr,
//                               int cbMultiByte,
//                               LPWSTR lpWideCharStr, 
//						         int cchWideChar
//						       );
//参数:
//	IN uiCodePage - 代码页
//	IN dwFlags - 无用,必须为0
//	IN lpMultiByteStr - 需要转化的字符串指针
//	IN cbMultiByte - lpMultiByteStr 指向的需要转化的字符个数,如果为-1,表示 lpMultiByteStr 以0结束
//	IN lpWideCharStr - 接受缓存
//	IN cchWideChar - lpWideCharStr 指向缓存的大小,如果为0,表示该函数仅仅返回需要的接受缓存的大小(没有实际的转换过程)
//返回值:
//	假如成功并且cchWideChar非0,返回实际写到 lpWideCharStr 的宽字符数(包含0结束)
//	假如成功并且cchWideChar为0,返回需要的接受宽字符数大小
//功能描述:
//	将一种字符格式转化为 unicode 格式
//引用: 
// ********************************************************************

int WINAPI WinCP_MultiByteToWideChar(
						UINT uiCodePage, 
						DWORD dwFlags, 
						LPCSTR lpMultiByteStr, 
						int cbMultiByte, 
						LPWSTR lpWideCharStr, 
						int cchWideChar 
						)
{
	const CODE_PAGE_INFO * pcp = GetCodePage( uiCodePage );

	if( pcp )
	{
		if( cchWideChar )
		{
			if( cbMultiByte == -1 )
				cbMultiByte = strlen( lpMultiByteStr ) + 1;
			if( cbMultiByte )
			    return pcp->pCodePageDrv->lpGetUnicode( pcp->dwcpHandle, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar );
		}
		else
		{	//得到需要的缓存宽字符数
			return pcp->pCodePageDrv->lpCountBufferSize( pcp->dwcpHandle, 
				                                         (LPCVOID)lpMultiByteStr, 
														 cbMultiByte, 
														 FALSE );
		}
	}
	SetLastError( ERROR_INVALID_PARAMETER );
	return 0;
}

// ********************************************************************
//声明:int WINAPI WinCP_WideCharToMultiByte(
//						UINT uiCodePage, 
//						DWORD dwFlags, 
//						LPCWSTR lpWideCharStr, 
//						int cchWideChar, 
//						LPSTR lpMultiByteStr, 
//						int cbMultiByte, 
//						LPCSTR lpDefaultChar, 
//						BOOL * lpUsedDefaultChar 
//						)
//参数:
//	IN uiCodePage - 代码页
//	IN dwFlags - 无用,必须为0
//	IN lpWideCharStr - 需要转化的 unicode 字符指针
//	IN cchWideChar - lpWideCharStr 指向的需要转化的字符个数,如果为-1,表示 lpWideCharStr 以0结束
//	IN lpMultiByteStr - 接受缓存
//	IN cbMultiByte - lpMultiByteStr 指向缓存的大小,如果为0,表示该函数仅仅返回需要的接受缓存的大小(没有实际的转换过程)
//	IN lpDefaultChar - 如果一个字符无法转换,用该指针指定的字符代替
//	IN lpUsedDefaultChar - 用于指示 lpDefaultChar 标志是否在转化过程中用过,值为 TRUE/FALSE
//返回值:
//	假如成功并且cbMultiByte非0,返回实际写到 lpMultiByteStr的字节数(包含0结束)
//	假如成功并且cbMultiByte为0,返回需要的接受缓存大小
//功能描述:
//	将 unicode 字符转化为指定的一种字符格式
//引用: 
// ********************************************************************

int WINAPI WinCP_WideCharToMultiByte(
						UINT uiCodePage, 
						DWORD dwFlags, 
						LPCWSTR lpWideCharStr, 
						int cchWideChar, 
						LPSTR lpMultiByteStr, 
						int cbMultiByte, 
						LPCSTR lpDefaultChar, 
						BOOL * lpUsedDefaultChar 
						)
{
	const CODE_PAGE_INFO * pcp = GetCodePage( uiCodePage );

	if( pcp )
	{
		if( cbMultiByte )
		{
			if( cchWideChar == -1 )
				cchWideChar = wcslen( lpWideCharStr ) + 1;
			if( cchWideChar )
			    return pcp->pCodePageDrv->lpGetChar( pcp->dwcpHandle, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, NULL, NULL );
		}
		else
		{	//得到需要的缓存字符数
			return pcp->pCodePageDrv->lpCountBufferSize( pcp->dwcpHandle, lpWideCharStr, cchWideChar, TRUE );
		}
	}
	SetLastError( ERROR_INVALID_PARAMETER );
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -