当前位置:首页 > 芯闻号 > 充电吧
[导读]发现开源代码的可利用资源真多,从sqlite3的源码中抠出了几个字符转换接口,稍微改造下了发现还挺好用的。下面是实现代码:/* ** Convert a UTF-8 string to microso

发现开源代码的可利用资源真多,从sqlite3的源码中抠出了几个字符转换接口,稍微改造下了发现还挺好用的。下面是实现代码:


/*
** Convert a UTF-8 string to microsoft unicode (UTF-16?). 
**
** Space to hold the returned string is obtained from malloc.
*/
static WCHAR *utf8ToUnicode(const char *zFilename){

	int nChar;
	WCHAR *zWideFilename;

	nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0);
	zWideFilename = static_cast(malloc(nChar*sizeof(zWideFilename[0])));
	if( zWideFilename==0 ){

		return 0;

	}
	nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, nChar);
	if( nChar==0 ){

		free(zWideFilename);
		zWideFilename = 0;

	}
	return zWideFilename;

}

/*
** Convert microsoft unicode to UTF-8.  Space to hold the returned string is
** obtained from malloc().
*/
static char *unicodeToUtf8(const WCHAR *zWideFilename){

	int nByte;
	char *zFilename;

	nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0);
	zFilename = static_cast(malloc( nByte ));
	if( zFilename==0 ){

		return 0;

	}
	nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte,
		0, 0);
	if( nByte == 0 )
	{
		free(zFilename);
		zFilename = 0;
	}
	return zFilename;

}

/*
** Convert an ansi string to microsoft unicode, based on the
** current codepage settings for file apis.
** 
** Space to hold the returned string is obtained
** from malloc.
*/
static WCHAR *mbcsToUnicode(const char *zFilename){

	int nByte;
	WCHAR *zMbcsFilename;
	int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;

	nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR);
	zMbcsFilename = static_cast(malloc( nByte*sizeof(zMbcsFilename[0])));
	if( zMbcsFilename==0 ){

		return 0;

	}
	nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte);
	if( nByte==0 )
	{
		free(zMbcsFilename);
		zMbcsFilename = 0;
	}
	return zMbcsFilename;

}

/*
** Convert microsoft unicode to multibyte character string, based on the
** user's Ansi codepage.
**
** Space to hold the returned string is obtained from
** malloc().
*/
static char* unicodeToMbcs(const WCHAR* zWideFilename){

	int nByte;
	char *zFilename;
	int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;

	nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0);
	zFilename = static_cast(malloc(nByte ));
	if( zFilename==0 ){

		return 0;

	}
	nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, nByte,
		0, 0);
	if( nByte == 0 ){

		free(zFilename);
		zFilename = 0;
	}
	return zFilename;

}

/*
** Convert multibyte character string to UTF-8.  Space to hold the
** returned string is obtained from malloc().
*/
static char* mbcsToUtf8(const char *zFilename){

	char *zFilenameUtf8;
	WCHAR *zTmpWide;

	zTmpWide = mbcsToUnicode(zFilename);
	if( zTmpWide==0 ){

		return 0;

	}
	zFilenameUtf8 = unicodeToUtf8(zTmpWide);
	free(zTmpWide);
	return zFilenameUtf8;
}

/*
** Convert UTF-8 to multibyte character string.  Space to hold the 
** returned string is obtained from malloc().
*/
static char* utf8ToMbcs(const char *zFilename){

	char *zFilenameMbcs;
	WCHAR* zTmpWide;

	zTmpWide = utf8ToUnicode(zFilename);
	if( zTmpWide==0 ){

		return 0;

	}
	zFilenameMbcs = unicodeToMbcs(zTmpWide);
	free(zTmpWide);
	return zFilenameMbcs;
}

std::string MbcsToUtf8( const char* pszMbcs )
{
	std::string str;
	WCHAR   *pwchar=0;
	CHAR    *pchar=0;
	int len=0;
	int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
	len=MultiByteToWideChar(codepage, 0, pszMbcs, -1, NULL,0);
	pwchar=new WCHAR[len];
	if(pwchar!=0)
	{
		len = MultiByteToWideChar(codepage, 0, pszMbcs, -1, pwchar, len);
		if( len!=0 )
		{
			len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, 0, 0, 0, 0);
			pchar=new CHAR[len];
			if(pchar!=0)
			{
				len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, pchar, len,0, 0);
				if(len!=0)                
				{
					str = pchar;                   
				}
				delete pchar;
			}
			delete pwchar;
		}
	}
	return str;
}

    

         要测试这些接口,为此我写了一个测试工程,是读取一个xml文件把里面的字符进行转换的,测试工程的代码下载地址如下:

unicode字符和多字节字符的相互转换接口及测试工程

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

近日,台积电董事会正式核准2025年度员工分红方案:全年业绩奖金与酬劳总额高达2061.46亿元新台币(约合人民币453亿元)。以台湾地区约7.8万名员工计算,人均分红约264万元新台币(约合人民币57.9万元),这一数...

关键字: 芯片 半导体

原“SEMI-e深圳国际半导体展暨集成电路产业创新展”全面升级的IICIE国际集成电路创新博览会将于2026年9月9日-11日在深圳国际会展中心(宝安)盛大启幕,以“跨界融合・全链协同,共筑特色芯生态”为主题,构建覆盖集...

关键字: 半导体 集成电路

Feb. 10, 2026 ---- 根据TrendForce集邦咨询最新高速互连市场研究,为应对AI所需的庞大运算需求,Google(谷歌)新世代Ironwood机柜系统结合3D Torus网络拓扑、Apollo OC...

关键字: AI 数据中心 GPU

Feb. 9, 2026 ---- 根据TrendForce集邦咨询最新数据显示,受惠于AI浪潮的推升,存储器与晶圆代工产值均将在2026年同步创下新高。存储器产业受供给吃紧与价格飙升影响,产值规模大幅扩张至 5,516...

关键字: 存储器 晶圆 AI

2月10日,随着港交所一声钟响,爱芯元智半导体有限公司(以下简称“爱芯元智”)正式挂牌上市,一举拿下“中国边缘AI芯片第一股”称号,成为了首家登陆港股的边缘计算AI芯片企业,同时也解锁了宁波2026年首家IPO企业的成就...

关键字: AI 芯片

成都2026年2月9日 /美通社/ -- 日前,国际独立第三方检测、检验和认证机构德国莱茵TÜV大中华区(简称"TÜV莱茵")与通威太...

关键字: 太阳能 数字化 光伏 光伏产业

上海2026年2月6日 /美通社/ -- 近日,国际公认的测试、检验和认证机构SGS(以下简称"SGS")为地平线机器人(股票代码:9660.HK)自主研发的"智驾安全基座"产品颁...

关键字: ISO ASIL 测试 隔离

由Fairland Group - iGarden通过美通社发布的新闻稿件《全球首款仿生双视泳池清洁机器人iGarden M1 Pro Max正式发布 斩获CES 2026创新奖》(发布时间:2026年2月7日)中, “...

关键字: GROUP LAN AIR 机器人

美国旧金山和中国苏州2026年2月8日 /美通社/ -- 信达生物制药集团(香港联交所股票代码:01801),一家致力于研发、生产和销售肿瘤、自身免疫、代谢、眼科等重大疾病领域创新药物的生物制药公司,宣布与礼来制药达成战...

关键字: COM 代码 创始人 控制
关闭