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

news2024/12/27 12:19:57

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
    操作如下图所示:
    在这里插入图片描述
    代码中仍使用正常的字符串写法。

  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中读取这段字符数据,并输出到命令行。这当然会乱码啦!如图所示:
u8字符串在936代码页
但是,如果你打开命令行后,将命令行的代码页切换到utf-8,再运行这个程序,则会输出正确的结果。如下图所示:

u8字符串在65001代码页

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代码页中的运行结果为:

在这里插入图片描述
可见,这三种方式只使用其中一种即可,u8和/execution-charset:utf-8不冲突,而gb2312ToUtf8/execution-charset:utf-8同时使用是不行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot实现地方废物回收机构平台管理系统【项目源码+论文说明】

基于springboot实现地方废物回收机构管理系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把地方废物回收机构管理与现在网络相结合&#xff0c;利用java技术建设地方废物回收机构管理系统&#xff0c;实现地方废物回收机构的信息化。则对于进一步提高地方废物回收机…

【Javascript】运算符(赋值,算术,自增,自减)

目录 赋值 算术 单个变量&#xff1a; 多个变量&#xff1a; 在字符串&#xff0c;数组中充当连接符 自符串与字符串 数组与数组 数组与字符串 自增与自减 前置 自增 自减 后置 自增 自减 赋值 var a 1;算术 单个变量&#xff1a; var a 1;a 1;console.l…

最小二乘法,可视化UI界面

import tkinter as tk import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from pylab import mplmpl.rcParams[font.sans-serif] [FangSong] # 指定默认字体 mpl.rcParams[axes.unicode_minus] False …

【matplotlib】matplotlib的颜色表

【matplotlib】matplotlib的颜色表 文章目录 【matplotlib】matplotlib的颜色表1. 颜色表Reference 1. 颜色表 在使用matplotlib库进行绘图的时候&#xff0c;只需要指定关键字coloryour_color就能修改绘制的颜色了&#xff0c;具体的颜色表如下。 Reference https://finthon…

文献阅读(207)FPGA HBM

题目&#xff1a;HBM Connect: High-Performance HLS Interconnect for FPGA HBM时间&#xff1a;2021会议&#xff1a;FPGA研究机构&#xff1a;UCLA Jason Cong 题目&#xff1a;Demystifying the Memory System of Modern Datacenter FPGAs for Software Programmers throug…

五金经营小程序商城的作用体现在哪

对消费者而言&#xff0c;如今线上购买五金是很多人的选择&#xff0c;传统线下购买&#xff0c;不仅需要跑路&#xff0c;而且店内未必有所需品&#xff0c;但线上平台则一目了然购买所需品&#xff0c;本地/外地均可以触达到&#xff0c;同时还可对用户/会员进行高效管理&…

vscode代码快捷输入

Vscode代码片段快捷输入 常用的代码片段为了避免重复输入,可以使用Vsco的中用户代码片段进行设置,这样就可以实现快捷输入. 操作流程 如下 打开vscode的设置 2. 找到用户代码片段 3. 选择模板 4. 然后写入代码片段即可 上面的代码片段可以设置多个,看自己 重点关注的是 prefi…

GoLong的学习之路(四)语法之循环语句

书接上回&#xff0c;上回说到运算符&#xff0c;这次我们说一个编程语言中最重要的一点&#xff1a;流程控制&#xff0c;及循环语句 文章目录 循环语句if else(分支结构)if条件判断特殊写法 for(循环结构)for range(键值循环) switch casegoto(跳转到指定标签)break(跳出循环…

2022年京东双11母婴品类数据回顾

母婴产品作为部分家庭的刚需&#xff0c;双11期间的行业热度也节节攀升&#xff0c;2022年双11期间&#xff0c;行业中不少品类赛道势头猛进。下面&#xff0c;鲸参谋带大家一起来回顾2022年双11期间母婴行业大盘及母婴重点细分赛道的销售表现。 母婴行业大盘 2022年双11期间&a…

基于鲸鱼算法的无人机航迹规划-附代码

基于鲸鱼算法的无人机航迹规划 文章目录 基于鲸鱼算法的无人机航迹规划1.鲸鱼搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鲸鱼算法来优化无人机航迹规划。 1.鲸鱼搜索算法 …

微积分(二) 导数与微分

前言 导数反映了函数值相对于自变量的变化快慢程度&#xff0c;而微分则表明当自变量有微小变化时&#xff0c;函数值大体上变化多少 瞬时速度的解决——极限 牛顿采用了一种无限逼近的方法。 平均速度的定义:如果一个物体在一段时间△t内位移了s,它在这段时间内的平均速度…

二进制明文字符串加密:还原与反还原

背景 上一篇文章中介绍了xorstr的原理和最小化验证概念的代码&#xff0c;这篇文章来看下这种已经被广泛应用于各恶意样本以及安全组件中的技术如何还原&#xff0c;如果还没看上篇建议先看下了解其实现后再看本篇文章 xorstr的现状 随着相关技术的应用越来越广&#xff0c;…

最新咸鱼签名JS逆向分析教程

本章教程,主要分享一下咸鱼H5网页端sign签名算法。 案例地址:https://h5.m.goofish.com/item?id=744640763988 程仅供参考,请勿滥用,由此带来的法律责任,需由自己承担。 目录 一、参数分析 二、逆向过程

TCmalloc (google开源项目核心部分模拟实现)

1什么是内存池 1.1池化技术 所谓“池化技术”&#xff0c;就是程序先向系统申请过量的资源&#xff0c;然后自己管理&#xff0c;以备不时之需。之所以要申请过 量的资源&#xff0c;是因为每次申请该资源都有较大的开销&#xff0c;不如提前申请好了&#xff0c;这样使用时就…

橙河网络:国外问卷调查赚钱的项目可靠吗?

国外问卷调查项目是可靠的&#xff0c;是一个长期稳定的互联网项目。 大家好&#xff0c;我是橙河网络&#xff0c;今天聊一聊国外问卷调查赚钱的项目可靠吗&#xff1f; 在海外地区&#xff0c;很多公司和机构&#xff0c;它们为了收集一些关于产品和服务的消费者意见&#…

读懂Json文件[妈妈再也不用担心我不读懂了]

第一次见到它&#xff0c;我特别害怕&#xff0c; 很大一个文件&#xff0c;还是二进制的&#xff0c;是什么意思呢&#xff1f;该文件是深度学习模型训练完成之后由模型的输出数据保存的结果数据&#xff1b; 在线JSON编译器 JSON Editor Online 把文件传上去&#xff01; …

React-native-camera 在小米手机上拍照查看闪退

场景&#xff1a;为实现可拍照和录像的相机用react-native-camera这个库手写一个相机&#xff0c;发现了拍出来的图片在小米10上查看闪退 根据手机后台捕获的错误信息是什么玩意太大了&#xff08;之前还以为是图片显示组件的问题&#xff09; 改进&#xff1a;相机吊起的时候…

unity中使用protobuf工具将proto文件转为C#实体脚本

unity中使用protobuf工具将proto文件转为C#实体脚本 介绍优点缺点Protobuf 为什么比 XML 快得多&#xff1f;Protobuf的EncodingProtobuf封解包的过程通常编写一个Google Protocol Buffer应用需要以下几步&#xff1a; Protostuff是什么Protobuf工具总结 介绍 protobuf也就是G…

第三章Maven依赖的特性-基础篇

文章目录 Maven依赖核心配置文件pom.xml依赖的范围概念compile 和 test 对比compile 和 provided 对比结论 测试验证 compile 范围对 main 目录有效验证test范围对main目录无效验证test和provided范围不参与服务器部署验证provided范围对测试程序有效 依赖的传递概念传递的原则…

计算机体系结构实验三-缓存一致性

最近在看CMU15-418&#xff0c;LECTURE10-11就是讲两个缓存一致性协议&#xff0c;刚好这部分内容在实验中学习过&#xff0c;在实验中监听式协议提到的是MSI协议(modified&#xff0c;shared&#xff0c;invalid)&#xff0c;lecture中还讲了优化的版本MESI(应该是实际使用的协…