user-0 提问: C语言把中文字符串复制到剪贴板是乱码求解决办法

回复:
user: user-1
content: 引用 3 楼 u012598124 的回复:[quote=引用 2 楼 sunyongliang118 的回复:] 改为 char strText[256] = "我被拷贝到剪切板！\n";     // 分配全局内存     hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));     改为char之后 复制出来的还是中文乱码[/quote] 把所有TCHAR改为char，同时把工程属性改为多字节字符集（方法按Alt+F7），改字符集为多字节字符集

user: user-1
content: UNICODE版本  /* #include<stdio.h> #include<stdlib.h> #include<math.h> #define line 11 //第n行的m个数可表示为 C(n-1,m-1)，即为从n-1个不同元素中取m-1个元素的组合数。 //即为：num!/(count!*(num-count)!)   "!"为阶乘    _int64 factorial(_int64 z)  //阶乘 { 	_int64 i,count_sum=1; 	for (i = 1; i <= z; ++i) 	{ 		count_sum *= i; 	} 	return count_sum; }  int main() { 	_int64 num, count, kong;  //行号-num   数字-count 空格-kong  打印序号-xuhao 	for (num = 0; num < line; num++) 	{ 		for (kong = line-num; kong > 0; --kong) 		{ 			printf("  "); 		} 		for (count = 0; count <= num; count++) 		{ 			printf("%lld  ", factorial(num)/ (factorial(count)*factorial(num-count))); 		} 		printf("\n"); 	} 	double a = 2,b = 3,c = 4; 	for(num = 1;num < 11;++num) 	{ 		printf("-----------------------------num=%d---------------------------\n",num); 		printf("%.1f^%lld=%lf\n",a,num,pow(a,(int)num)); 		printf("%.1f^%lld=%lf\n",b,num,pow(b,(int)num)); 		printf("%.1f^%lld=%lf\n",c,num,pow(c,(int)num)); 	} 	system("pause"); 	return 0; } */  #include<stdio.h> #include <Windows.h> #include<cwchar>  void main() { // 打开剪贴板    if (!OpenClipboard(NULL)|| !EmptyClipboard())     {    printf("打开或清空剪切板出错！\n");    return;    }     HGLOBAL hMen;    TCHAR strText[256] = {L"我被拷贝到剪切板！\n"};     // 分配全局内存     hMen = GlobalAlloc(GMEM_MOVEABLE, ((wcslen(strText))*sizeof(TCHAR))*2);      if (!hMen)    {    printf("分配全局内存出错！\n");     // 关闭剪切板     CloseClipboard();    return;          }     // 把数据拷贝考全局内存中    // 锁住内存区     LPWSTR lpStr = (LPWSTR)GlobalLock(hMen);      // 内存复制    wmemcpy(lpStr, strText, ((wcslen(strText))*sizeof(TCHAR)));     // 字符结束符     lpStr[wcslen(strText)] = (TCHAR)0;    // 释放锁     GlobalUnlock(hMen);     // 把内存中的数据放到剪切板上    SetClipboardData(CF_UNICODETEXT, hMen);    CloseClipboard();    return;  }     ANSI版本  #include<stdio.h> #include <Windows.h>  void main() { // 打开剪贴板    if (!OpenClipboard(NULL)|| !EmptyClipboard())     {    printf("打开或清空剪切板出错！\n");    return;    }     HGLOBAL hMen;    char strText[256] = "我被拷贝到剪切板！\n";     // 分配全局内存     hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));      if (!hMen)    {    printf("分配全局内存出错！\n");     // 关闭剪切板     CloseClipboard();    return;          }     // 把数据拷贝考全局内存中    // 锁住内存区     LPSTR lpStr = (LPSTR)GlobalLock(hMen);      // 内存复制    memcpy(lpStr, strText, ((strlen(strText))*sizeof(char)));     // 字符结束符     lpStr[strlen(strText)] = (TCHAR)0;    // 释放锁     GlobalUnlock(hMen);     // 把内存中的数据放到剪切板上    SetClipboardData(CF_TEXT, hMen);    CloseClipboard(); return;  }    两个我都在操作系统上编译运行正确通过的。测试没问题。

user: user-2
content: 另可参看MSDN给的例子；https://msdn.microsoft.com/en-us/library/windows/desktop/ms649016(v=vs.85).aspx#_win32_Copying_Information_to_the_Clipboard

user: user-2
content: unicode 使用 CF_UNICODETEXT

user: user-0
content: 引用 2 楼 sunyongliang118 的回复:改为 char strText[256] = "我被拷贝到剪切板！\n";     // 分配全局内存     hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));     改为char之后 复制出来的还是中文乱码

user: user-1
content: 改为 char strText[256] = "我被拷贝到剪切板！\n";     // 分配全局内存     hMen = GlobalAlloc(GMEM_MOVEABLE, ((strlen(strText)+1)*sizeof(char)));

user: user-0
content: 运行完Ctrl+V  粘贴出来的是乱码 求解决办法