VC非ASCII语言复制到剪切板乱码问题
MFC版本
今天遇到奇怪的现象,日文系统下在控件上按下Ctrl+C,再粘贴出来得到乱码,非得切换到日文输入法再进行粘贴不可.经过代码分析,得出结论是剪切板SetClipboardData()时自动内存转换惹的祸.这家伙默认状态下并不能识别双字节的字符.
所以修改的思路是,先统统转成宽字符,再按照宽字符进行拷贝.
之前的代码:
BOOL CopyStringToClipBoard( HWND hOwner, CString strSource )
{if( ::OpenClipboard(hOwner) ){HANDLE clipbuffer ;char *buffer ;::EmptyClipboard() ;clipbuffer = ::GlobalAlloc( GMEM_DDESHARE,strSource.GetLength()+1 ) ;buffer = (char*)::GlobalLock(clipbuffer) ;strcpy( buffer, LPCSTR(strSource) ) ;::GlobalUnlock(clipbuffer) ;::SetClipboardData(CF_TEXT, clipbuffer) ;::CloseClipboard() ;} return FALSE ;
}
修改之后的代码:
BOOL CopyStringToClipBoard( HWND hOwner, CString strSource )
{if( ::OpenClipboard(hOwner) ){int buff_size = strSource.GetLength() ;CStringW strWide = CStringW(strSource);int nLen = strWide.GetLength();HANDLE clipbuffer ;char* buffer;::EmptyClipboard() ;clipbuffer = ::GlobalAlloc( GMEM_DDESHARE, (nLen + 1) * 2 ) ;buffer = (char*)::GlobalLock(clipbuffer) ;memset(buffer, 0, (nLen + 1) * 2);memcpy_s(buffer, nLen * 2, strWide.GetBuffer(0), nLen* 2 );strWide.ReleaseBuffer();::GlobalUnlock(clipbuffer) ;::SetClipboardData(CF_UNICODETEXT, clipbuffer) ;::CloseClipboard() ;} return FALSE ;
}
///
C++ SDK UNICODE版本
TCHAR g_szCode[0x200]= { 0 };
if(OpenClipboard(NULL)){EmptyClipboard();// 此处用_tcslen得到字符串的实际长度 没有计算最后的结尾符号\0\0 但是剪切板以及_tcscpy_s函数规定字符串最后是以\0\0结尾//所以这里加1预留出新字符串结尾符号的空间SIZE_T nSize = _tcslen(g_szCode) + 1; // 申请内存的空间大小 这里是字节来计算 所以需要把字符串实际长度 * 每个字符所占用的空间 UNICODE是2个字节 所以TCHAR就代表2HGLOBAL hClip=GlobalAlloc(GMEM_DDESHARE, nSize * sizeof(TCHAR));PTSTR pszBuf=(PTSTR)GlobalLock(hClip);// 这里是以字符数量来复制的 nSize是pszBuf中字符数量的大小 g_szCode的字符数量比nSize小1一个字符 用于_tcscpy_s函数最后需要追加\0\0// 由于_tcscpy_s会自动在新字符串上追加结尾符号\0\0 所以这里nSize的大小必须比g_szCode大1 且nSize是pszBuf的实际空间大小_tcscpy_s(pszBuf, nSize, g_szCode);GlobalUnlock(hClip); SetClipboardData(CF_UNICODETEXT, hClip);CloseClipboard();}
注意:如果这里的_tcscpy_s字符没有设置正确 这句代码很可能不会报错 但是在后边的SetClipboardData会报错 这样的错误不容易查找
VC非ASCII语言复制到剪切板乱码问题相关推荐
- html数据复制到剪切板
一.原生js指令复制 function copyUtil(info) {var $textArea = $('<textarea></textarea>');$textArea ...
- 微信小程序复制到剪切板及换行问题
wxml <textarea type="text" v-model="copyContent" placeholder="请输入内容" ...
- clipboard.js 实现动态获取内容并复制到剪切板
一个按钮实现先ajax请求,再实现复制功能: 使用clipboard.js分为以下几个步骤: 1.引入一个clipboard.js的文件: 2.新建一个clipboard对象: 3.点击按钮获取目标对 ...
- 将内容复制到剪切板兼容主流浏览器的解决方案
html : <body><div class="demo-area"><label for="copy-input">输入 ...
- 微信小程序_把chatgpt聊天数据复制到剪切板
文章目录 ⭐ 前言 ⭐ 开始 网格背景样式配置 对话框样式配置 复制到剪切板 ⭐ 结束 ⭐ 前言 大家好,我是yma16,不止前端,本文将介绍微信小程序中 chatgpt聊天页面设计和复制聊天数据. ...
- 微信小程序之一键复制到剪切板
最近在开发小程序项目里遇到一个小难题-----一键复制 在网页开发里 我们可以引用大牛封装好的复制插件,比如无flash插件clipboard.js适用移动端,pc端------- 言归正装,打开微信 ...
- VC 操作word部分代码(利用剪切板取得Word中的图片,ClipBoard, Addpicture)
在32位WIN7 VS2012环境下测试通过,在64位WIN7 VS2013环境下GlobalLock和GlobalSize函数返回NULL,具体参见注释 // 读取给定文件名的Doc文档中的数据 B ...
- Android将内容复制到剪切板
近期,项目里需要用到将部分内容复制到剪切板,以前用到都是随用随找,挺麻烦的,最近整理一下,在这里记录一下 其实Android提供的剪贴板框架,Android提供ClipboardManager.Cli ...
- Html将内容复制到剪切板.
Html将内容复制到剪切板. 引入clipboard.min.js /*!* clipboard.js v1.6.1* https://zenorocha.github.io/clipboard.js ...
最新文章
- tensorflow-gpu
- 华人打造二次元老婆生成器!尔康容嬷嬷成萌妹,图像视频都能变 | Demo可玩
- rest-framework 解析器
- 1995 年乔布斯访谈:什么对产品最重要
- python实现什么功能_Python 实现WC功能
- Centos/Red Hat6.8 安装、配置、启动Gitlab (内网环境)心得分享
- Python字符串| isdigit()方法与示例
- 贪吃蛇程序不要白不要,一个赞就够了
- java 在已有的so基础上封装jni_webshell中的分离免杀实践java篇
- 计算机应用软件安装教程,计算机应用与网基础教程 常用软件安装.ppt
- java react_Java 9React流
- YYText识别链接和点击事件
- python均线斜率_一根20日均线闯天下——量化回测“压箱底指标”,值得散户认真研读...
- App自动化测试之企微打卡、快手刷金币
- JIRA Service Desk获得 ITIL 认证
- 社工工具包 SEToolkit
- 电脑硬件升级完全解决方案-1
- OGRE+CG学习日记[1]-简单的3D程序
- Kotlin -by 详解
- Scapy用法官方文档