CStdioFile实现完美支持UNICODE方案

VC++ MFC实战:企业级客户资源管理系统开发全解析 桌面应用开发是软件工程中的重要领域,尤其在需要高独立性、本地化部署和直接硬件交互的场景中。其核心原理在于利用操作系统提供的原生API和框架,构建不依赖网络环境、运行高效且部署简便的应用程序。在Windows平台上,Visual C++(VC++)配合MFC(Microsoft Foundation Classes)框架,曾是构建这类应用的经典技术组合,其价值在于能生成依赖极少的原生可执行文件,并提供了文档/视图架构、消息映射等成熟机制,极大地加速了典型桌面应用的开发流程。这种技术方案广泛应用于工业控制、遗留 阅读详情

飞鸽传书软件在读写文件时,会遇到UNICODE的文件,怎么办呢?这个给大家一个CStdioFile实现完美支持UNICODE方案,先放着以后可能会用到。

// 目标文件路径名称的宏定义   
#define FileURL _T("C://coderui.txt")   

//   
// 将“单字节的字串符类型(_MSBC环境)”转换为“宽字节的字符串类型(Unicode环境)”   
//   
INT _MSBCTo_Unicode(CString strInPut_MSBC, CString *strOutPut_Unicode)   
{   
INT nLen;   
CHAR *pcBuf;   

if(strInPut_MSBC == _T(""))   
{   
   return 0;   
}   

pcBuf = (CHAR *)strInPut_MSBC.GetBuffer(strInPut_MSBC.GetLength());   
nLen = MultiByteToWideChar(CP_ACP, 0, pcBuf, -1, NULL, 0);   

// (Unicode环境WCHAR需要加1,默认已经加1了)   
WCHAR *pwBuf = new WCHAR[nLen];   
memset(pwBuf, 0, nLen);   

MultiByteToWideChar(CP_ACP, 0, pcBuf, -1, pwBuf, nLen);   

strOutPut_Unicode->Format(_T("%s"), pwBuf);   

delete []pwBuf;   

nLen -= 1;   

return nLen;   
}   

//   
// 将“宽字节的字符串类型(Unicode环境)”转换为“单字节的字串符类型(_MSBC环境)”   
//   
INT _UnicodeTo_MSBC(CString strInPut_Unicode, CString *strOutPut_MSBC)   
{   
INT nLen;   
WCHAR *pwBuf;   

if(strInPut_Unicode == _T(""))   
{   
   return 0;   
}   

pwBuf = strInPut_Unicode.GetBuffer(strInPut_Unicode.GetLength());   
nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, 0, NULL, NULL);   

// (Unicode环境需要加2,不然Format时内存数据格式不对程序会崩)   
CHAR *pcBuf = new CHAR[nLen + 2];   
memset(pcBuf, 0, nLen + 2);   

WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, pcBuf, nLen, NULL, NULL);   

strOutPut_MSBC->Format(_T("%s"), pcBuf);   

delete []pcBuf;   

nLen -= 1;   

return nLen;   
}   

//   
// 将保存成“宽字节类型”的“单字节类型”字符串(Unicode环境),   
// 还原为正确的“单字节类型”字符串(_MSBC环境)。   
//   
VOID _UnicodeOf_MSBCTo_MSBC(CString *str)   
{   
INT nLen;   
CHAR *pcBuf;   

nLen = str->GetLength();   

// (Unicode环境需要加3,不然Format时内存数据格式不对程序会崩)   
pcBuf = new CHAR[nLen + 3];   
memset(pcBuf, 0, nLen + 3);   

for (INT i = 0 ; i < nLen; i++)   
{   
   pcBuf = (CHAR)str->GetAt(i);   
}   

str->Format(_T("%s"), pcBuf);   

delete []pcBuf;   
}   

//   
// 使用“CStdioFile”类进行读文件操作   
//   
void StdioReadFile()   
{   
CStdioFile OpenFileR;   
CString str_Unicode,str_MSBC;   

if(!OpenFileR.Open(FileURL, CFile::modeRead))   
{   
   return;   
}   

// 按行来循环读文件   
do   
{   
   // 把“_MSBC环境”下的“CString”(CHAR),直接填充到了“Unicode环境”下的“CString”(WCHAR)中,   
   // 这样会导致“汉字”显示成乱码。如果想正确显示,需要对该字符串进行相应的处理。   
   OpenFileR.ReadString(str_MSBC);   

   if(str_MSBC != _T(""))   
   {   
    // 将保存成“宽字节类型”的“单字节类型”字符串(Unicode环境),   
    // 还原为正确的“单字节类型”字符串(_MSBC环境)。   
    _UnicodeOf_MSBCTo_MSBC(&str_MSBC);   

    // 将“单字节的字串符类型(_MSBC环境)”转换为“宽字节的字符串类型(Unicode环境)”   
    _MSBCTo_Unicode(str_MSBC, &str_Unicode);   

    AfxMessageBox(str_Unicode);   
   }   
}while(str_MSBC != _T(""));   

OpenFileR.Close();   
}   

//   
// 使用“CStdioFile”类进行写文件操作   
//   
void StdioWriteFile()   
{   
int nLength;   
HANDLE hFile;   
CFileFind pfile;   
CStdioFile OpenFileW;   
CString str_Unicode,str_MSBC;   

if(pfile.FindFile(FileURL, 0))   
{   
   pfile.Close();   

   if(DeleteFile(FileURL))   
   {   
    hFile = CreateFile(FileURL, 0, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, NULL);   
    CloseHandle(hFile);   
   }   
   else   
   {   
    return;   
   }   
}   
else   
{   
   hFile = CreateFile(FileURL, 0, FILE_SHARE_WRITE, NULL, CREATE_NEW, 0, NULL);   
   CloseHandle(hFile);   
}   

if(!OpenFileW.Open(FileURL, CFile::modeWrite))   
{   
   return;   
}   

str_Unicode = _T("Coderui您好!/n");   

// 将“宽字节的字符串类型(Unicode环境)”转换为“单字节的字串符类型(_MSBC环境)”   
nLength = _UnicodeTo_MSBC(str_Unicode, &str_MSBC);   

OpenFileW.SeekToEnd();   
OpenFileW.Write(str_MSBC, nLength); // 写入“单字节类型的字串符(_MSBC环境)”   
OpenFileW.Close();   

}   

原文:CStdioFile实现完美支持UNICODE方案


CStdioFileEx(支持ANSI、UNICODE、UNICODE big endian、UTF-8编码的文本读取 /*程序用途:按行读取常见 (包括ANSI、UNICODE、UNICODE big endian、UTF-8)格式的文本文件 */ //核心算法:CStdioFileEx继承自CStdioFile, 覆盖CStdioFile的 BOOL ReadString(CString& rString)方法, // 根据不同文件编码特征,寻找文件回车换行符判断读取行结束,文件结束符判断文件结束 // 检测不同文件编码头部,获取文件类型后调用不同的读取函数 //测试结果:在Windows7 VS2008环境下测试上述四种格式的txt文件通过 //尚未完成:未重载CStdioFile的 virtual LPTSTR ReadString( LPTSTR lpsz, UINT nMax )方法 // 未完成WriteString方法,未在VC UNICODE 环境下的测试 立即下载

相关推荐

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如图一所示。差异(differences):MemSeg引入人工模拟的异常图像在训练阶段使模型能够区分正常和异常的图像,减轻了半监督学习只能用正常样本进行训练的不足,然后在推理阶段可以直接输入图像无需做任何后处理。共性(commonalities):MemSeg引入了一个记忆池来记录正常样本的通用模式,在训练和推理阶段,比较输入图像和记忆池中的样本之间的差异,为异常区域的定位提供有用的信息。

斯人若彩虹,遇上方知有! 4841

使用CStdioFile 读写UNICODE文档

 一:写文档   1  创建文档并写入内容 CString filePath=L"C:\\unicode.txt"; CStdioFile wfile; if (!wfile.Open(filePath,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary)) { AfxMessageBox(L"文件无法修改");

[Starain工作室] Love Life、Love Code、Love you 776

vmware虚机Debian10磁盘空间无损扩容

该方法不适和LVM的磁盘管理 备份 一定要先做备份,虚机中直接创建一个快照备份 vm上增加空间 初始给的40G空间不够需要扩容,vm那给系统添加到100G 重新分区 查看当前分区情况 sudo fdisk -l

lms99251的博客 7455

【CStdioFile扩展(支持Ansi、Unicode、Utf-8等文本格式)】

例如:以下是官方博客例子浅析先加入相关的头文件和库文件。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了的函数和方法。

我的博客 1018

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5512

香橙派5Max + Realsense D435i + Fast-Drone-250:手把手教你搭建一个完整的无人机视觉开发环境

本文详细介绍了如何利用香橙派5Max、Realsense D435i深度相机和Fast-Drone-250项目搭建完整的无人机视觉开发环境。从硬件连接到ROS配置,再到项目部署与性能优化,提供全栈式实战指南,助力开发者快速实现SLAM算法验证和自主导航功能开发。

weixin_30879169的博客 463

CStdioFile的Writestring写入中文的总结(unicode-ucs2/utf8-无Bom/ansi-gb2312)

(参考:http://blog.youkuaiyun.com/sun20082567/article/details/8316625 http://blog.youkuaiyun.com/gillerr/article/details/8518495 等)  (注:下面部分内容未验证,为推测的行为) (注:前提-使用VS,工程文字模式为unicode模式--对代码中的文字有影响) (注:字节序为little-end

春夜喜雨的专栏 8369

华为OD机试双机位C卷-统计差异值大于相似值二元组个数(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【统计差异值大于相似值二元组个数】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 统计差异值大于相似值二元组个数

qq_45776114的博客 784

VC 编程ANSI环境下读写Unicode文件和将CStdioFile类扩展,读取UNICODE文本文件

VC 编程ANSI环境下读写Unicode文件没有注意到文件编码的不同会产生这么多的问题,在动手以前查询了很多资料,在本博客中收藏了不少先辈的成果,在这里一并表示致敬!       关于ANSI和Unicode编码的原理在这里也不说了,主要讲下如何读写!       首先确定你的工程是采用的是什么编码环境,默认是ANSI,不同的字符集读写文件的差别也比较大,我这里只在ANSI环境下做的,下一步在探

阳光岛主 7657

银河麒麟硬盘健康检测:smartctl/badblocks实战与坏盘预判

xfs_repair检查。S.M.A.R.T检测。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 860

VR大空间开发前期,设备选项与流程

欢迎开发者加入 VR 大空间开发之旅!本系列教程将以 Pico 和 HTC 设备为核心,系统拆解从基础搭建到功能实现的全流程,助你快速掌握开发要点。本系列共 12 篇,专为有编程基础但缺乏大空间开发经验的开发者设计。前 7 篇针对 Pico 和 HTC 设备差异分别讲解,后续步骤通用。核心目录如下:​1. 空间环境要求 - 灯光设置 - 场地面积规划 - 识别图案设计2. 网络部署方案3. 客户端体验模式解析 - 一体机模式 - 云渲染模式 - 背包体验模式4. Pico空间录制方法

unitygroup的博客 1354

CstdioFileEx读写UNICODE文本文件

CstdioFileEx读写UNICODE文本文件        弄了好久,都没把TXT文件乱码的问题搞定……    步骤:1.         到http://www.codeproject.com/下载CstdioFileEx类2.         使用CstdioFileEx示例代码如下:    TCHAR FileName[100];    CStdioFi

gyjdk0601的专栏 2841

1.FPGA开发软件安装——Vivado

目前主流的FPGA公司包括xilinx和Intel(原altera公司),其开发软件分别为vivado和quartusii。我们这里以目前国内应用较多的vivado为例进行安装讲解。 1、首先是去官网下载 Vivado 安装包:https://www.xilinx.com/support/download.html。下载这个最大的、支持所有的 OS 如 Windows/Linux 的安装包。 2、下载完之后,就进行解压。(最好在解压和安装之前都关闭所有的杀毒软件以防万一)。紧接着,解压完之后...

FPGA/MATLAB学习教程/源码/项目合作开发 8257

C++ MFC串口通信上位机开发:工业级工具的实现与优化

串口通信是嵌入式系统、工业自动化等领域中设备与计算机通信的基础技术,它通过串行接口实现数据的逐位传输。其工作原理基于特定的电气标准和协议(如RS-232),通过配置波特率、数据位等参数确保数据可靠交换。这项技术的核心价值在于为硬件调试、设备控制和数据采集提供了稳定、直接的通信桥梁。在工业控制、仪器仪表及自动化测试等应用场景中,对通信工具的可靠性、执行效率和部署便捷性有极高要求。因此,基于C++和MFC框架开发串口通信上位机成为满足这些严苛需求的经典方案。MFC作为成熟的Windows桌面应用框架,结合C++

weixin_33726318的博客 353

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Windows API 函数

《Windows API函数手册》摘要 本文档是Windows平台开发的权威参考手册,全面收录774个核心API函数,涵盖系统管理、进程线程、窗口消息、文件操作、图形处理等12大功能模块。手册采用结构化编排,主要特点包括: 编码规范 详细区分多字节(char)与宽字符(wchar_t)编码体系 提供LPSTR/LPCWSTR等字符串指针类型的完整解析 说明UTF-8与GBK编码转换的实际应用场景 核心功能模块 窗口创建:完整展示从注册类到消息循环的窗口生命周期 文件操作:覆盖CreateFile/ReadF

gqk01的博客 862

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MFC - CStdioFile 读取txt文件UNICODE 中文异常

/********************************** /* /* #include <locale.h> /* /********************************** // 获取txt文件的全路径 CString strConfigIniPath = fileDlg.GetPathName(); C...

weixin_30847271的博客 748

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

vc中unicode读写文件CStdioFile

TCHAR acBuff[MAX_PATH]; ::SecureZeroMemory(acBuff, sizeof(acBuff));::ExpandEnvironmentStrings(PROGRAM_PATH, acBuff, MAX_PATH);CString strPa

哈喇子的专栏 609

将CStdioFile类扩展,读取UNICODE文本文件

 最近因为要读取SQL脚本文件,用CStdioFile来读取脚本文件,却在程序调试时读取不了文件。后来看了一下文本文件格式,竟然是UNICODE格式的,原来在导出SQL脚本的时候,选项默认的是UNICODE格式。为了同时支持ANSI和UNICODE两种格式,在Codeproject站点上找到了CStdioFileEx类的代码,但在调试运行过程中发现,在生成UNICODE版本的执行文件时,运行没

benny5609的专栏 1252

使用CStdioFile 读取Unicode文件时出现乱码问题解决方案

使用CStdioFile 读取Unicode文件时出现乱码问题解决方案 我们都知道在stdFile.ReadString(temp)中,temp是CString类型,但是我们接收到的数据由于是宽字符 ,所以在CEditBox显示有乱码。   可能网上提供了大量的方法将WCHAR或者wchar_t转化为CString的方法,不可少都用到了 MultiByteToWideChar和Wid

一步一个脚印的往前走! 2436

CStdioFile 指定文件类型为UNICODE写文件

今天要写一个csv文件,文件格式y

TheDeaf的专栏 1262

CStdioFile的ReadString读入中英文的总结(unicode-ucs2/utf8-无bom/ansi) .

文章讨论的前提:使用ReadString来读取字符串 utfi/ansi情况下,不能使用binary来打开,因为这种模式下,一次按照TCHAR的大小,读取两个字符,结束符号0d的话,需要读取到0x 0d 00才会认为是读取一行结束。而我们知道untf8/ansi情况存储的话,里面是没有0x00存在的。 utf8/ansi情况下,使用typetext打开,可以把字符读入到CString里面,但存

春夜喜雨的专栏 5980

VC读写TXT文件和CStdioFile读写乱码

最近突然想用用TXT文件存储数据,网上找了段源码,采用CStdioFile类简单方便,但出现一个很奇怪的问题,从TXT读取的文件一旦遇到中文就变成乱码,可重新写进TXT文档却又全部正常,后来发现是ANSI格式UNICODE格式兼容问题,貌似VC2005以上版本都有这毛病,网上找了很多解决方法,不过某位大神设置语言区域的方法最简单实用,源码贴出来供大家参考

ZANE的博客 4208

CStdioFile在UNICODE字符集下读写中文

问题 以CFile::typeBinary的形式读写包含中文的文件,未出现乱码。 以CFile::typeText方式读写, 分两种情况:在多字节字符集下,使用CStdioFile::ReadString读取包含中文的文件,正常;工程编码切换至UNICODE字符集,则出现了中文乱码。 探究查找MSDN文档,获得以下信息: Unicode™ Stream I/O in Text and Binar

憧憬,思考,奋斗,飞翔 3317

CStdioFile读取UNICODE问题解决办法

1 #include <locale.h> 2 3 4 setlocale( LC_CTYPE, ("chs"));//添加这个 5 CStdioFile flie; 6 flie.Open(_T("a.txt"),CStdioFile::modeWrite | CStdioFile::modeCreate); 7 CString str = _T("测试"); ...

weixin_30838873的博客 346
上一篇: 设计飞鸽时CCommandLineInfo解决方案
下一篇: 飞鸽传书文件记录选择CFile还是CStdioFile?
普通网友
博客等级 码龄22年 1万+粉丝 2784原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值