MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码

这篇具有很好参考价值的文章主要介绍了MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码

背景:为什么同时使用MFC和OSG

我建立了一个MFC工程,以OSG作为视图显示的基础,通过点击MFC菜单启动某些功能。因此,在工程中包含了OSG库。并且,为了使生成的exe在Windows下能正常处理中文路径,使用**多字节字符集(ANSI)**作为编码方式。因此,程序中并不会使用L()宏来定义Unicode字符串,也不会使用wchar等宽字符类型,而是所有字符串都用一样的写法,比如:

const char* pHUDText="我爱你中国";

如果不考虑OSG,这种写法完全没有问题,运行MFC程序、使用MFC对话框显示和读取中文输入都是正常工作的。
但是,我的工程中还引入了OSG库,这个库仅支持utf-8的字符串显示。所以我必须将要输入OSG显示的中文字符串转换成utf-8编码格式。为了完成这件事,进行了下面几种尝试:

  1. MSVC项目属性中加入 /execution-charset:utf-8
    操作如下图所示:
    MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码,mfc,c++
    代码中仍使用正常的字符串写法。

  2. 使用u8字符串

  3. 使用函数将字符串转到utf-8编码(使用支持C++11的编译器时,完全可以由方法2替代)。定义如下:

#include<Windows.h>//WideCharToMultiByte定义在这里
void unicodeToUTF8(const std::wstring &src, std::string& result) 
{ 
	int n = WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, 0, 0, 0, 0 ); 
	result.resize(n); 
	::WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, (char*)result.c_str(), result.length(), 0, 0 ); 
}

void gb2312ToUnicode(const std::string& src, std::wstring& result) 
{ 
	int n = MultiByteToWideChar( CP_ACP, 0, src.c_str(), -1, NULL, 0 ); 
	result.resize(n); 
	::MultiByteToWideChar( CP_ACP, 0, src.c_str(), -1, (LPWSTR)result.c_str(), result.length()); 
}

void gb2312toUTF8(const std::string& src, std::string& result) 
{ 
	std::wstring strWideChar; 
	gb2312ToUnicode(src, strWideChar); 
	unicodeToUTF8(strWideChar, result); 
}

其中CP_ACP就是指当前代码页。CP_UTF8指的是65001(utf-8)代码页。
gb2312toUTF8的第一个参数是传入的待转换字符串,第二个参数是结果字符串。

详解三种使字符串能在OSG中显示的方法

/execution-charset:utf-8 设置程序执行时的编码为utf-8

即程序源码中的字符串编译后在可执行程序或库中的编码方式都由此选项控制。如果一个MSVC项目在命令行加入了这一项,则程序中的所有字符串都会按照utf-8编码存储。

u8字符串字面量

使用u8字符串字面量仅对当前字符串的编码指定为utf-8存储。即,如果程序本身是按系统的ANSI编码正常工作,设置u8字符串字面量
示例:

#include <iostream>

int main()
{
    std::cout << u8"大家好";
}

在这段代码中,编译器会将"大家好"三个汉字按照utf-8编码存进生成的.exe程序中。执行程序时,按照Windows系统默认代码页(ANSI,936)从.exe中读取这段字符数据,并输出到命令行。这当然会乱码啦!如图所示:
MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码,mfc,c++
但是,如果你打开命令行后,将命令行的代码页切换到utf-8,再运行这个程序,则会输出正确的结果。如下图所示:

MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码,mfc,c++

GB2312toUTF8函数

通过WINAPI将字符串从默认代码页ANSI转到Unicode,再从Unicode转到utf-8。

总结

像我的应用场景,MFC+OSG场景显示,MFC程序中的字符读取都还是按ANSI编码,仅仅将输入OSG的字符串转换为utf-8编码,所以不适合采用第一种策略(将所有字符串都以utf-8编码存储)。第二种方法和第三种方法是等价的,且在编译器支持u8字符串字面量时更推荐第二种方法,简洁又省事。

如果已经在C/C+±命令行中加入了/execution-charset:utf-8,但是在程序中又同时使用了GB2312toUTF8函数将字符串转换,则又会导致乱码。例如:

int main()
{
    std::string str, str1, str2;
    str1 = "大家好!\n";
    str2 = u8"大家好!\n";
    gb2312ToUtf8(str1, str);
    std::cout << str;
    std::cout << str1;
    std::cout << str2;
}

在65001代码页中的运行结果为:

MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码,mfc,c++
可见,这三种方式只使用其中一种即可,u8和/execution-charset:utf-8不冲突,而gb2312ToUtf8/execution-charset:utf-8同时使用是不行的。文章来源地址https://www.toymoban.com/news/detail-720089.html

到了这里,关于MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • osg实现鼠标框选

    目录 1. 需求的提出 2. 具体实现      2.1. 禁止场景跟随鼠标转动      2.2. 矩形框前置绘制 3. 附加说明         3.1. 颜色设置说明         3.2.矩形框显示和隐藏的另一种实现        有时需要在屏幕通过按住键盘上的某个键如Ctrl键且按住鼠标左键,拖出一个矩形,实现框选

    2024年02月08日
    浏览(43)
  • OPEN AI接入MidJourney 画图支持GPT4中文智能优化效果惊艳

    OPEN AI 平台 开放免费AI聚合服务平台,提供应用程序一键接入AI画图,对话的能力。 目前已经支持GPT3和GPT4普通对话和流式对话。 支持GPT画图和MidJourney 画图。 后续还会接入更多功能 在线接入案例演示体验 这里主要展示一下MJ的强大的画图功能 平台发展版本来龙去脉 如果大

    2024年02月12日
    浏览(42)
  • chinese-stable-diffusion中文场景文生图prompt测评集合

    我在git上新建了一个仓库,主要是总结一波了chainese-stable-diffusion的模型算法,非常欢迎关注:  GitHub - leeguandong/Awesome-Chinese-Stable-Diffusion: 中文文生图stable diffsion模型集合 中文文生图stable diffsion模型集合. Contribute to leeguandong/Awesome-Chinese-Stable-Diffusion development by creating an accou

    2024年02月04日
    浏览(41)
  • ChatGPT 中文调教指南。各种场景使用指南。学习怎么让它听你的话。

    “写一本拥有出人意料结局的推理小说。” “写一个让读者参与其中的交互小说。” “为孩子们写一本激励他们勇敢面对挑战的小说。” “编写一个有关科技创新的未来世界的小说。” “创造一个让读者感到沉浸其中的幻想故事。” 我想让你充当 Linux 终端。我将输入命令

    2024年02月01日
    浏览(59)
  • 【开发环境】VSCode 安装插件 ( 简体中文插件 | Open in Browser 插件 | Auto Rename Tag 插件 | JS-CSS-HTML Formatter 插件 )

    在 VSCode 中 , 左侧的 按钮 是 扩展 按钮 , 使用 Ctrl + Shift + X 也可以快速进入插件安装界面 ; 在弹出的 扩展 面板中 , 可以搜索和安装插件 ; 在扩展工具面板中 , 搜索 Chinese , 可以看到 简体中文 插件 , 安装该插件后 , 界面会变为简体中文界面 ; 安装完毕后 , 重启 VSCode 即可完成

    2024年02月13日
    浏览(50)
  • AR-HUD

    目录 一、C-HUD、W-HUD、AR-HUD 1.实际考虑车外环境信息与相对位置 2.实时考虑驾驶员眼睛的位置 二、ADAS 1、定义 2、ADAS关键节点 3 、主要功能 A.信息辅助 第一类行车监控类 第二类危险预警类 第三类是驾驶便利类 IA信息辅助类整体列表  B、控制辅助 第一类紧急应对类 第二类为

    2024年02月06日
    浏览(84)
  • AR HUD全面「上新」

    AR HUD赛道正在迎来新的时代。 上周, 蔚来ET9正式发布亮相 ,新车定位为D级行政旗舰轿车,其中,在智能座舱交互层面,继理想L系列、长安深蓝S7之后,也 首次取消仪表盘,取而代之的是业内首个全焦段AR HUD。 从公开的参数来看,这套全新一代AR HUD的创新之处在于,可以实

    2024年01月21日
    浏览(43)
  • 中文编程工具开发语言开发的实际案例:触摸屏点餐软件应用场景实例

    中文编程工具开发语言开发的实际案例:触摸屏点餐软件应用场景实例 软件特色: 1、功能实用,操作简单,不会电脑也会操作,软件免安装,已内置数据库。软件在关闭的时候,可以设置会员数据备份到U盘,数据本机备份一份,U盘备份一份,双重备份数据安全。 2、软件既

    2024年02月08日
    浏览(45)
  • vue插件——relation-graph——实现关系图功能——技能提升

    在做组织关系图时,经常会遇到关系图的实现要求,就是要将人与人或者组织与组织或者人与组织之间的关系进行一一展示。已知的就是节点和关系。 最近在写后台管理系统时,遇到一个需求,就是要实现关系图: 如下图所示: 在前年写天眼查功能时,我也遇到过这种需求

    2024年02月11日
    浏览(42)
  • 【VR】Network Manager HUD

    💦本专栏是我关于VR开发的笔记 🈶本篇是——Network Manager HUD 网络管理器 HUD是一种快速启动工具,可帮助您立即开始构建多人游戏,而无需首先构建用于游戏创建/连接/加入的用户界面。 这个组件是这个样子的: 在Game窗口的显示是这样的: offset X: HUD GUI 的水平像素偏移,

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包