osg中文路径、中文汉字解决方案

本文详细介绍了OSG在Windows环境下对中文的支持,包括字体、路径和输入法的处理方法。阐述了如何设置字体以正确显示中文,解决中文路径识别问题,并提及了中文输入法的相关考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OSG 中文解决方案 【转】

概述

本文只限于 windows 环境下。

OSG 在 windows 下对中文支持已经非常的好了,但是可能很多人并不知道如何去正确的使用。为了解决这些常见的问题,还有一些基础知识的普及。特此把 OSG 的中文相关问题集中起来说明一下。

 

理论基础

一切的原点 ACSII

不管什么字符集、什么编码,0-127的编号都是一致的。

字符集

把具体的文字映射到一个编号,所有的映射的集合就是字符集。

字符集编码

为什么还有字符集编码?就好比图片,为了存储体积或者特殊要求,你必须选择不同的格式;如:RGB、PNG等。

代码页 Codepage

windows 内码使用 UCS-2 字符集,其他所有字符集或者字符集编码都被统一分配了一个 codepage 编号,系统会根据这个编号来自动转换。简体中文版 windows 的 codepage 是 GBK,编号 936。顺带一提 ANSI 是指当前系统的默认 codepage,不同语言版本的系统 ANSI 就不同。

 

中文显示

中文显示主要通过 osgText 模块的 String 来完成。

font 文件必须是有中文内容的,你不能用 一个不支持中文字符的 font。

剩下的只有 String 的 3 种字符数据来源的问题了。

String(const std::string& str) {set(str);} 这个基本上是没戏了;

String(const wchar_t* text) {set(text);} 这是最简单的,不需要多余的解释;

String(const std::string& text, Encoding encoding) {set(text, encoding);} 这种方式也可以,只是用起来很烦,需要其他转换函数辅助处理。

 

中文路径

开始很多人都会费解为什么 OSG 不支持中文路径,原因很简单:这完全是 osgDB::ifstream 的小问题。因为很多插件都把文件作为流来处理了所以不支持刘的插件就能正确的识别中文路径。

 

简单粗暴型

在任何实际路径操作之前添加下面的代码就可以让 osgDB::ifstream 正确的识别中文路径了。

setlocale(LC_ALL, ""); // 空字符串表示当前系统默认区域

当然你可能觉得怎么返回默认状态呢?

setlocale(LC_ALL, NULL); // 返回值就是当前区域状态的字符串。

当然你可以不还原,因为只是简单粗暴的方式。

 

直面问题型

打开 osgDB 下的 fstream.cpp 在开头的地方有:

#ifdef OSG_USE_UTF8_FILENAME

#define OSGDB_CONVERT_UTF8_FILENAME(s) convertUTF8toUTF16(s).c_str()

#else

#define OSGDB_CONVERT_UTF8_FILENAME(s) convertUTF8toUTF16(convertStringFromCurrentCodePageToUTF8(s)).c_str()

#endif

红色部分原来为 s,修改后就能正确识别中文路径了。(前提是你没有启用 OSG_USE_UTF8_FILENAME 这个宏;启用它会让问题更复杂,甚至工程编码混乱。)

令人疑惑的是原来的 s 并没有任何语法问题,为什么会出错?修改后只是精确了字符集,并非是必要的。不清楚在其他系统下有没有这样的问题。

 

中文输入法

这个话题很复杂,牵扯很多问题,有时间慢慢写吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值