从ansitounicodee转到ansi会漏掉内容吗

(window.slotbydup = window.slotbydup || []).push({
id: '4540180',
container: s,
size: '250,200',
display: 'inlay-fix'
热门资料排行
添加成功至
资料评价:
所需积分:0温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
Unicode转UTF8void&CConvertDlg::OnBnClickedButtonUnicodeToU8(){&&&&//&unicode&to&UTF8&&&&wchar_t*&wszString&=&L"abcd1234你我他";&&&&//预转换,得到所需空间的大小,这次用的函数和上面名字相反&&&&int&u8Len&=&::WideCharToMultiByte(CP_UTF8,&NULL,&wszString,&wcslen(wszString),&NULL,&0,&NULL,&NULL);&&&&//同上,分配空间要给'\0'留个空间&&&&//UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存&&&&char*&szU8&=&new&char[u8Len&+&1];&&&&//转换&&&&//unicode版对应的strlen是wcslen&&&&::WideCharToMultiByte(CP_UTF8,&NULL,&wszString,&wcslen(wszString),&szU8,&u8Len,&NULL,&NULL);&&&&//最后加上'\0'&&&&szU8[u8Len]&=&'\0';&&&&//MessageBox不支持UTF8,所以只能写文件&&&&//接下来写入文本&&&&//写文本文件,UTF8的BOM是0xbfbbef&&&&CFile&cF&&&&cFile.Open(_T("1.txt"),&CFile::modeWrite&|&CFile::modeCreate);&&&&//文件开头&&&&cFile.SeekToBegin();&&&&//写BOM,同样低位写在前&&&&cFile.Write("\xef\xbb\xbf",&3);&&&&//写入内容&&&&cFile.Write(szU8,&u8Len&*&sizeof(char));&&&&cFile.Flush();&&&&cFile.Close();&&&&delete[]&szU8;&&&&szU8&=NULL;}UTF8转UNICODEvoid&CConvertDlg::OnBnClickedButtonU8ToUnicode(){&&&&//UTF8&to&Unicode&&&&//由于中文直接复制过来会成乱码,编译器有时会报错,故采用16进制形式&&&&char*&szU8&=&"abcd1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";&&&&//预转换,得到所需空间的大小&&&&int&wcsLen&=&::MultiByteToWideChar(CP_UTF8,&NULL,&szU8,&strlen(szU8),&NULL,&0);&&&&//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间&&&&wchar_t*&wszString&=&new&wchar_t[wcsLen&+&1];&&&&//转换&&&&::MultiByteToWideChar(CP_UTF8,&NULL,&szU8,&strlen(szU8),&wszString,&wcsLen);&&&&//最后加上'\0'&&&&wszString[wcsLen]&=&'\0';&&&&//unicode版的MessageBox&API&&&&::MessageBoxW(GetSafeHwnd(),&wszString,&wszString,&MB_OK);&&&&//写文本同ansi&to&unicode}Ansi转换utf8和utf8转换Ansi就是上面2个的结合,把unicode作为中间量,进行2次转换即可
阅读(1741)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_095074',
blogTitle:'VC中Ansi、Unicode、UTF8字符串之间的转换和写入文本文件',
blogAbstract:'Unicode转Ansi也是2种方法void&CConvertDlg::OnBnClickedButtonUnicodeToAnsi(){',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}从ANSI到UniCode_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
从ANSI到UniCode
&&主要写了从ANSI到Unicode的变化过程,其中涉及到字符、字节之间的差别,从8位到16位字符的存储
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢查看: 926|回复: 4
编码_Ansi到Unicode 改善建议
阅读权限70
结帖率: (1/4)
本帖最后由 萧阳天 于
23:44 编辑
原里的编码_Ansi到Unicode命令如果中间有字母数字 后面的Ansi会无法继续转换到Unicode
下面是修改后的代码
&&编码_Ansi到Unicode字节集√将Ansi码转换为Unicode码;成功返回转换后的字节集;保留字母数字;Ansi文本型&&&欲转换的Ansi文本非标准Unicode编码逻辑型&√&默认为假,为标准Unicode编码数据2字节集&&长度整数型&&字节集字节集&&计次整数型&&临时文本文本型&&是否有数字字母逻辑型&&临时数组文本型&0临时计次整数型&&如果真 (Ansi = “”)返回 ({&&})字节集 = 到字节集 (Ansi)临时计次 = 0临时文本 = Ansi计次循环首 (取字节集长度 (字节集), 计次)临时计次 = 临时计次 + 1判断 (字节集 [计次] > 44 且 字节集 [计次] < 58 且 字节集 [计次] ≠ 47)&&' -.0-9加入成员 (临时数组, 取文本左边 (临时文本, 临时计次 - 1))临时文本 = 取文本右边 (Ansi, 取字节集长度 (字节集) - 计次)临时计次 = 0是否有数字字母 = 真判断 (字节集 [计次] > 64 且 字节集 [计次] < 91)&&' A-Z加入成员 (临时数组, 取文本左边 (临时文本, 临时计次 - 1))临时文本 = 取文本右边 (Ansi, 取字节集长度 (字节集) - 计次)临时计次 = 0是否有数字字母 = 真判断 (字节集 [计次] > 96 且 字节集 [计次] < 123)&&' a-z加入成员 (临时数组, 取文本左边 (临时文本, 临时计次 - 1))临时文本 = 取文本右边 (Ansi, 取字节集长度 (字节集) - 计次)临时计次 = 0是否有数字字母 = 真如果 (计次 = 取字节集长度 (字节集) 且 临时文本 ≠ “”)加入成员 (临时数组, 临时文本)计次循环尾 ()如果 (是否有数字字母 = 假)长度 = MultiByteToWideChar (936, 0, Ansi, -1, {&&}, 0)数据2 = 取空白字节集 (长度 × 2)MultiByteToWideChar (936, 0, Ansi, -1, 数据2, 长度 × 2)如果真 (非标准Unicode编码)数据2 = 取字节集左边 (数据2, 取字节集长度 (数据2) - 2)临时文本 = Ansi计次循环首 (取数组成员数 (临时数组), 计次)长度 = MultiByteToWideChar (936, 0, 临时数组 [计次], -1, {&&}, 0)数据2 = 取空白字节集 (长度 × 2)MultiByteToWideChar (936, 0, 临时数组 [计次], -1, 数据2, 长度 × 2)如果真 (非标准Unicode编码)数据2 = 取字节集左边 (数据2, 取字节集长度 (数据2) - 2)临时文本 = 文本_替换 (临时文本, 1, , , 临时数组 [计次], 到文本 (数据2))计次循环尾 ()数据2 = 到字节集 (临时文本)返回 (数据2).版本 2
.子程序 编码_Ansi到Unicode, 字节集, 公开, 将Ansi码转换为Unicode码;成功返回转换后的字节集;保留字母数字;
.参数 Ansi, 文本型, , 欲转换的Ansi文本
.参数 非标准Unicode编码, 逻辑型, 可空, 默认为假,为标准Unicode编码
.局部变量 数据2, 字节集
.局部变量 长度, 整数型
.局部变量 字节集, 字节集
.局部变量 计次, 整数型
.局部变量 临时文本, 文本型
.局部变量 是否有数字字母, 逻辑型
.局部变量 临时数组, 文本型, , &0&
.局部变量 临时计次, 整数型
.如果真 (Ansi = “”)
& & 返回 ({&&})
.如果真结束
字节集 = 到字节集 (Ansi)
临时计次 = 0
临时文本 = Ansi
.计次循环首 (取字节集长度 (字节集), 计次)
& & 临时计次 = 临时计次 + 1
& & .判断开始 (字节集 [计次] > 44 且 字节集 [计次] < 58 且 字节集 [计次] ≠ 47)&&' -.0-9
& && &&&加入成员 (临时数组, 取文本左边 (临时文本, 临时计次 - 1))
& && &&&临时文本 = 取文本右边 (Ansi, 取字节集长度 (字节集) - 计次)
& && &&&临时计次 = 0
& && &&&是否有数字字母 = 真
& & .判断 (字节集 [计次] > 64 且 字节集 [计次] < 91)&&' A-Z
& && &&&加入成员 (临时数组, 取文本左边 (临时文本, 临时计次 - 1))
& && &&&临时文本 = 取文本右边 (Ansi, 取字节集长度 (字节集) - 计次)
& && &&&临时计次 = 0
& && &&&是否有数字字母 = 真
& & .判断 (字节集 [计次] > 96 且 字节集 [计次] < 123)&&' a-z
& && &&&加入成员 (临时数组, 取文本左边 (临时文本, 临时计次 - 1))
& && &&&临时文本 = 取文本右边 (Ansi, 取字节集长度 (字节集) - 计次)
& && &&&临时计次 = 0
& && &&&是否有数字字母 = 真
& && &&&.如果 (计次 = 取字节集长度 (字节集) 且 临时文本 ≠ “”)
& && && && &加入成员 (临时数组, 临时文本)
& && &&&.否则
& && &&&.如果结束
& & .判断结束
.计次循环尾 ()
.如果 (是否有数字字母 = 假)
& & 长度 = MultiByteToWideChar (936, 0, Ansi, -1, {&&}, 0)
& & 数据2 = 取空白字节集 (长度 × 2)
& & MultiByteToWideChar (936, 0, Ansi, -1, 数据2, 长度 × 2)
& & .如果真 (非标准Unicode编码)
& && &&&数据2 = 取字节集左边 (数据2, 取字节集长度 (数据2) - 2)
& & .如果真结束
& & 临时文本 = Ansi
& & .计次循环首 (取数组成员数 (临时数组), 计次)
& && &&&长度 = MultiByteToWideChar (936, 0, 临时数组 [计次], -1, {&&}, 0)
& && &&&数据2 = 取空白字节集 (长度 × 2)
& && &&&MultiByteToWideChar (936, 0, 临时数组 [计次], -1, 数据2, 长度 × 2)
& && &&&.如果真 (非标准Unicode编码)
& && && && &数据2 = 取字节集左边 (数据2, 取字节集长度 (数据2) - 2)
& && &&&.如果真结束
& && &&&临时文本 = 文本_替换 (临时文本, 1, , , 临时数组 [计次], 到文本 (数据2))
& & .计次循环尾 ()
& & 数据2 = 到字节集 (临时文本)
返回 (数据2)
您可以选择打赏方式支持楼主
阅读权限10
结帖率: (0/3)
retertertr
您可以选择打赏方式支持他
阅读权限160
感谢反馈,暂不采纳
您可以选择打赏方式支持他
阅读权限70
结帖率: (1/4)
本帖最后由 q 于
23:31 编辑
第一个在循环上少加了个 临时文本 = Ansi&&不加的话数字字母前面的就无法转换了&&【已修改】
您可以选择打赏方式支持他
阅读权限70
结帖率: (1/4)
本帖最后由 q 于
23:30 编辑
已重新修改 现在的就是的了
您可以选择打赏方式支持他
精易论坛 - 有你更精彩 /1
支持作者开源,请积极给优秀源码评分
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,QQ: ,,邮箱:@
Powered by
粤公网安备 2505:18 提问
Ansi工程中如何使用Unicode Edit控件?
一个MFC - Ansi工程,比较大,代码很多,加上也不是我写的,所以不要建议我把整个工程转为Unicode了,能走这条路我也不上来提问了。
它里面其中一个对话框,对话框上有个Edit , 是只读的,不用接受用户输入。
我想在这个Edit上显示Unicode字符串,不要叫我把Unicode转换成Ansi再显示,能这样做我也不会上来提问了。
关键是,有些Unicode字符,Ansi 根本显示不出来,出来的都是乱码或问号,比如Unicode编码0x2776,转到Ansi是0x3F,一个问号。
现在,就是想在这个CEdit上显示Unicode字符串,请教解决方案。
按时间排序
显式的使用Unicode API
Unicode字符串使用CStringW来保存
给Edit设置文本使用SetWindowTextW
CStringW str = L"你好";
m_edit.SetWindowTextW(str);
有这么简单就好了,你可以试试,如果是ansi的Edit,
你试试: m_edit.SetWindowTextW( (WCHAR*)"\x76\x27\x77\x27\x00\x00" );
相关函数会检查这个Edit使用的是ansi还是unicode, 如果是ansi,就会将unicode转换成ansi。 而以上字符串转换成ansi之后,将无法表示,是乱码。
每一个HWND,系统都会维护一个描述结构,这个结构中就标记了这个Wnd是ansi还是unicode, 是使用ansi还是unicode,只与这个标记有关,与你调用A版本还是U版本的函数一丁点关系也没有。
你翻看win2k的源代码就会看到,USER32!ValidateHwnd( HWND ) 将返回一个 PWND, PWND里有个PED,
PED里有个32位的Flag,而第22位是:
: 1; /* is the edit control Ansi or unicode */
这个标记好像是无法在后期更改的,而是在CreateWindowEx时决定的,如果使用的是A版本,fAnsi 则会置1,如果使用的是W版本,则fAnsi置0。
当你对这个窗口进行字符串相关的操作的时候,无论你是使用A版本的函数还是W版本的函数,系统内部都会根据这个标记对字符串进行相关的转换!
当你以为使用CreateWindowExW进行创建Edit就可以解决这个问题的时候,想得太天真了。 确实,系统不再转换你提供的Unicode字符串,但是显示的时候,仍然是以Ansi代码页来显示,照样乱码!
我曾试过在ansi版本的Edit窗口创建之后, 手动将 UINT fAnsi 强制置0,然后直接调用 USER32!EditWndProcW , 发现Edit可以显示 ??? 这类ansi显示不了的字符了,但是系统内部有地方处理缓冲区错误。
其他相关推荐

我要回帖

更多关于 ansi unicode 的文章

 

随机推荐