user-0 提问: 将文件中UTF8编码格式转为UNICODE问题请大家指教

回复:
user: user-1
content: 引用 9 楼 sjmicosoft 的回复:如果不用vc只用纯C实现呢？  string是stl你可以把类型换成相应类型，再试试~

user: user-2
content: utf-8 只是 unicode 的一种实现形式，其他的 unicode 要涉及字节序，像 UTF16BE、UTF16LE 或者使用 BOM，LZ 你确定了吗？看 LZ 的代码好像是 UTF16LE，这种形式可不常见哦。 另外 LZ 的代码好像只转码了最后一行。

user: user-0
content: 引用 8 楼 wb117908406 的回复: string UTF8_To_String(const char* szSrc) { 	if(NULL==szSrc || 0==strlen(szSrc)) 	{ 		return ""; 	}  	int nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, NULL, 0); 	unsigned short *wszGBK = new unsigned short[nLen+1]; 	memset(wszGBK, 0, nLen*2+2); 	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, (LPWSTR)wszGBK, nLen);  	nLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL); 	char* szGBK = new char[nLen+1]; 	memset(szGBK, 0, nLen+1); 	WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, nLen, NULL, NULL);  	string strTemp(szGBK); 	delete []wszGBK;  	wszGBK = NULL; 	delete []szGBK;   	szGBK = NULL;  	return strTemp; }  string String_To_UTF8(const string& strSrc) { 	if (strSrc.empty()) 	{ 		return ""; 	}  	int nLen=MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), -1, NULL,0); 	WCHAR* pwBuf = new WCHAR[nLen+1]; 	memset(pwBuf, 0, nLen * 2 + 2); 	MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), strSrc.length(), pwBuf, nLen);  	nLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, 0, NULL, NULL); 	char *pBuf=new char[nLen + 1]; 	memset(pBuf, 0, nLen + 1); 	WideCharToMultiByte (CP_UTF8, 0, pwBuf, -1, pBuf, nLen, NULL,NULL);  	string strTemp(pBuf); 	delete[] pBuf; 	pBuf = NULL; 	delete[] pwBuf; 	pwBuf = NULL; 	return strTemp; }  如果不用vc只用纯C实现呢？

user: user-1
content: string UTF8_To_String(const char* szSrc) { 	if(NULL==szSrc || 0==strlen(szSrc)) 	{ 		return ""; 	}  	int nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, NULL, 0); 	unsigned short *wszGBK = new unsigned short[nLen+1]; 	memset(wszGBK, 0, nLen*2+2); 	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szSrc, -1, (LPWSTR)wszGBK, nLen);  	nLen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL); 	char* szGBK = new char[nLen+1]; 	memset(szGBK, 0, nLen+1); 	WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, nLen, NULL, NULL);  	string strTemp(szGBK); 	delete []wszGBK;  	wszGBK = NULL; 	delete []szGBK;   	szGBK = NULL;  	return strTemp; }  string String_To_UTF8(const string& strSrc) { 	if (strSrc.empty()) 	{ 		return ""; 	}  	int nLen=MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), -1, NULL,0); 	WCHAR* pwBuf = new WCHAR[nLen+1]; 	memset(pwBuf, 0, nLen * 2 + 2); 	MultiByteToWideChar(CP_ACP, 0, strSrc.c_str(), strSrc.length(), pwBuf, nLen);  	nLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, 0, NULL, NULL); 	char *pBuf=new char[nLen + 1]; 	memset(pBuf, 0, nLen + 1); 	WideCharToMultiByte (CP_UTF8, 0, pwBuf, -1, pBuf, nLen, NULL,NULL);  	string strTemp(pBuf); 	delete[] pBuf; 	pBuf = NULL; 	delete[] pwBuf; 	pwBuf = NULL; 	return strTemp; }

user: user-0
content: 还有 ，这个要用C语言实现，不用VC，还需要改哪些地方呢？

user: user-0
content: 引用 1 楼 jha334201553 的回复:// 多字节转宽字节，内存需要自行释放 PWSTR MulToWide( PSTR str ) { 	PWSTR  pElementText; 	int    iTextLen;  	iTextLen = MultiByteToWideChar( CP_ACP, 		0, 		(PCHAR)str, 		-1, 		NULL, 		0 ); 	 	pElementText =  		(PWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (iTextLen+1)*sizeof(WCHAR));  	MultiByteToWideChar( CP_ACP, 		0, 		(PCHAR)str, 		-1, 		pElementText, 		iTextLen );  	return pElementText; }用完自己HeapFree掉内存  请问为什么要转宽字节呢？我程序中直接加上这个函数可以吗？

user: user-0
content: 引用 楼主 sjmicosoft 的回复:我现在需要将一个文件转换编码格式，即将UTF8转为UNICODE，900.txt文件中有“测试文件”几个汉字，将其执行结果存到result1.txt文件中。但是转换后发现汉字的转换并不对，不知该怎么改，请大家指教。以下是我的程序：   //逐行读取文件函数 bool ReadLine(FILE *fp,char words[]) { 	char *ptr = words; 	if(fp==NULL)  	{ 		puts("The file is not exist!"); 		return false; 	} 	if(feof(fp)) 	{ 		puts("The end of the file!"); 		return false; 	} 	*ptr ='\0'; 	char vChar=getc(fp); 	while(!feof(fp)&&vChar!='\n') 	{ 		*(ptr++)=vChar; 		*ptr='\0'; 		vChar=getc(fp); 	} 	//printf("%s\n",words); 	printf("%d",strlen(words));  	return true; } //转换函数UTF8->UNICODE int Utf82Uni(char *str, int * ptr)  {   int byte;   byte = *((unsigned char *) str);   //单字节处理   if (byte < 0xC0)   {       *ptr = (int) byte;       return 1;   }   //双字节处理   else if (byte < 0xE0)   {       if ((str[1] & 0xC0) == 0x80) 	  { 	   	   //两个字节情况：低字节以10开头，形式为110xxxxx 10xxxxxx  	    *ptr = (int) (((byte & 0x1F) << 6) | (str[1] & 0x3F)); 	    return 2; 	  }          *ptr = (int) byte;         return 1;   }   //三字节处理   else if (byte < 0xF0)   {       if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) 	  { 	  //三字节情况：后两个字节都已10开头，形式为：1110xxxx 10xxxxxx 10xxxxxx  	    *ptr = (int) (((byte & 0x0F) << 12)| ((str[1] & 0x3F) << 6) | (str[2] & 0x3F)); 	    return 3;  	  }         *ptr = (int) byte;         return 1;   }    else    { 	  *ptr = (int) byte;       return 1;    } }   int main() {         char words[MAX]; 	char *next = words; 	int uni; 	int len = 0;//转unicode后字节长度 	 	FILE *fp,*fp1; 	         int i=1,CountNum=0; 	fp = fopen("E:\\AIX\\900","rb"); 	fp1 = fopen("E:\\AIX\\result1.txt","wb"); 	 	if (fp == NULL) 	{ 		printf("Open this file failed!"); 		exit(1); 	} 	 	while(ReadLine(fp,words)) 	{ 		CountNum++; 		printf("%s\n",words);	 	}              //将文件中字符转码 	for (int j=0; *next; j++) 	{ 		len = Utf82Uni(next, &uni); 		next += len; 		printf("unicode长度：%d\nunicode格式：%x\n", len, uni);        	}      	fclose(fp); 	fclose(fp1); }  为什么要转宽字节呢？我那程序中再加上这个函数可以吗？

user: user-3
content: #define _CRT_SECURE_NO_WARNINGS  #include <cstdlib> #include <clocale> #include <cstdio>  int main() { 	setlocale(LC_CTYPE, "chs"); 	char mbs[] = "你好,c++"; 	wchar_t  wcs[32]; 	mbstowcs(wcs, mbs, 32); //multibyte string to wide char string 	printf("%s-->%ls\n", mbs, wcs); 	return 0; }

user: user-4
content: Linux：iconv Windows：MultiByteToWideChar

user: user-5
content: 转码用iconv库。   引用 楼主 sjmicosoft 的回复:我现在需要将一个文件转换编码格式，即将UTF8转为UNICODE，900.txt文件中有“测试文件”几个汉字，将其执行结果存到result1.txt文件中。但是转换后发现汉字的转换并不对，不知该怎么改，请大家指教。以下是我的程序：   //逐行读取文件函数 bool ReadLine(FILE *fp,char words[]) { 	char *ptr = words; 	if(fp==NULL)  	{ 		puts("The file is not exist!"); 		return false; 	} 	if(feof(fp)) 	{ 		puts("The end of the file!"); 		return false; 	} 	*ptr ='\0'; 	char vChar=getc(fp); 	while(!feof(fp)&&vChar!='\n') 	{ 		*(ptr++)=vChar; 		*ptr='\0'; 		vChar=getc(fp); 	} 	//printf("%s\n",words); 	printf("%d",strlen(words));  	return true; } //转换函数UTF8->UNICODE int Utf82Uni(char *str, int * ptr)  {   int byte;   byte = *((unsigned char *) str);   //单字节处理   if (byte < 0xC0)   {       *ptr = (int) byte;       return 1;   }   //双字节处理   else if (byte < 0xE0)   {       if ((str[1] & 0xC0) == 0x80) 	  { 	   	   //两个字节情况：低字节以10开头，形式为110xxxxx 10xxxxxx  	    *ptr = (int) (((byte & 0x1F) << 6) | (str[1] & 0x3F)); 	    return 2; 	  }          *ptr = (int) byte;         return 1;   }   //三字节处理   else if (byte < 0xF0)   {       if (((str[1] & 0xC0) == 0x80) && ((str[2] & 0xC0) == 0x80)) 	  { 	  //三字节情况：后两个字节都已10开头，形式为：1110xxxx 10xxxxxx 10xxxxxx  	    *ptr = (int) (((byte & 0x0F) << 12)| ((str[1] & 0x3F) << 6) | (str[2] & 0x3F)); 	    return 3;  	  }         *ptr = (int) byte;         return 1;   }    else    { 	  *ptr = (int) byte;       return 1;    } }   int main() {         char words[MAX]; 	char *next = words; 	int uni; 	int len = 0;//转unicode后字节长度 	 	FILE *fp,*fp1; 	         int i=1,CountNum=0; 	fp = fopen("E:\\AIX\\900","rb"); 	fp1 = fopen("E:\\AIX\\result1.txt","wb"); 	 	if (fp == NULL) 	{ 		printf("Open this file failed!"); 		exit(1); 	} 	 	while(ReadLine(fp,words)) 	{ 		CountNum++; 		printf("%s\n",words);	 	}              //将文件中字符转码 	for (int j=0; *next; j++) 	{ 		len = Utf82Uni(next, &uni); 		next += len; 		printf("unicode长度：%d\nunicode格式：%x\n", len, uni);        	}      	fclose(fp); 	fclose(fp1); }

user: user-6
content: // 多字节转宽字节，内存需要自行释放 PWSTR MulToWide( PSTR str ) { 	PWSTR  pElementText; 	int    iTextLen;  	iTextLen = MultiByteToWideChar( CP_ACP, 		0, 		(PCHAR)str, 		-1, 		NULL, 		0 ); 	 	pElementText =  		(PWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (iTextLen+1)*sizeof(WCHAR));  	MultiByteToWideChar( CP_ACP, 		0, 		(PCHAR)str, 		-1, 		pElementText, 		iTextLen );  	return pElementText; }用完自己HeapFree掉内存