概述
本文只限于 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 并没有任何语法问题,为什么会出错?修改后只是精确了字符集,并非是必要的。不清楚在其他系统下有没有这样的问题。
 
中文输入法
这个话题很复杂,牵扯很多问题,有时间慢慢写吧。
 
原文 : http://giskel.blog.163.com/blog/static/7166004520138384747352/

OSG 中文解决方案 【转】的更多相关文章

  1. encodeURIComponent编码后java后台的解码 (AJAX中文解决方案)

    encodeURIComponent编码后java后台的解码 (AJAX中文解决方案) 同学的毕业设计出现JavaScript用encodeURIComponentt编码后无法再后台解码的问题. 原来 ...

  2. EasyUI的DataGrid 分页栏英文改中文解决方案

    (一)分页栏英文改中文解决方案 这个问题其实很简单,就是引入文件jquery-easyui-1.3/locale/easyui-lang-zh_CN.js . 注意这个文件要放在本页js的后面,放在最 ...

  3. XeTeX中文解决方案(temp)

    临时记录一下XeTeX的中文解决方案.一些包的文档只是走马观花得到的解决方法,所以可能有诸多纰漏. 另个人还是比较看好LuaTeX,但是在里边鼓捣中文还是一团糟,等探索一下再回来补充. 我使用的包是x ...

  4. CactiEZ中文解决方案和使用教程

    CactiEZ中文版是最简单有效的Cacti中文解决方案,整合Spine,RRDTool和美化字体.集成Thold,Monitor,Syslog,Weathermap,Realtime,Errorim ...

  5. pdf文件之itextpdf插入html内容以及中文解决方案

    简述 目前网上已经有很多种html文件直接转pdf的技术帖子,但是很少有直接将部分html作为段落插入到pdf中,而且也没有一个可以很好的解决中文显示的问题. 因此今天上午围绕这个问题进行了研究,把解 ...

  6. cmd无法输入中文解决方案

    1.regedit 2.选中HKEY_CURRENT_USER-Console,找到LoadConIme,双击,设置值为1,十六进制 3.此时应该已经ok了.如还不行,看一下%systemroot%\ ...

  7. tcpdf中文解决方案

    步骤如下:1.确保你测试tcpdf能正常输出英文内容的pdf2.测试输入中文内容后显示是?的乱码或者空白分析原因,是因为我们输入的中文,tcpdf字体库并不支持,因此乱码或者空白显示 添加一个合适的字 ...

  8. 最简单 iText 的 PDF 生成方案(含中文解决方案)HTML 转为 PDF

    转自:http://my.oschina.net/sanji/blog/277704 最近正好项目有用到 ITEXT ,在网络上搜索了一番,发现了很多方案,但是感觉对于一般开发来说都太复杂了,本文提供 ...

  9. python爬虫url带中文解决方案之一

    import urllib2 urllib2.quote("呵呵哒") #输出 '%BA%C7%BA%C7%DF%D5'

随机推荐

  1. Mybatis学习—XML配置文件

    总结自 Mybatis官方中文文档 XML 映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息.文档的顶层结构如 ...

  2. hdu 3367(与最大生成树无关。无关。无关。重要的事情说三遍+kruskal变形)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  3. AC日记——方差 洛谷 P1471

    方差 思路: 线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeN ...

  4. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API

    问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...

  5. lr_Vugen界面图

  6. hdu 5576 dp

    题目大意:给你一个长度为 n 的 字符串表示一个乘法,一次操作随机选两个字符进行交换,进行m次操作,让你求出所有可能操作 的答案和.  (1 <= n, m <= 50) 思路:巨难.. ...

  7. 线性基【CF845G】Shortest Path Problem?

    Description 给定一张 \(n\) 个点 \(m\) 条边的无向图,一开始你在点 \(1\),且价值为 \(0\) 每次你可以选择一个相邻的点,然后走过去,并将价值异或上该边权 如果在点 \ ...

  8. 洛谷——P1958 上学路线_NOI导刊2009普及(6)

    P1958 上学路线_NOI导刊2009普及(6) 题目描述 你所在城市的街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道.南北方向的a条街道从西到东依次编号为l到a,而东西方向的b条街道从 ...

  9. C++中template的.h文件和.cpp文件的问题

    在C++中,用到类模板时,如果类似一般的类声明定义一样,把类声明放在.h文件中,而具体的函数定义放在.cpp文件中的话,会发现编译器会报错.如类似下面代码: //test.h文件 #ifndef TE ...

  10. python 写文件write(string), writelines(list) ,读文件

    read()方法用于直接读取字节到字符串中,可以接参数给定最多读取的字节数,如果没有给定,则文件读取到末尾. readline()方法读取打开文件的一行(读取下个行结束符之前的所有字节),然后整行,包 ...