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 并没有任何语法问题,为什么会出错?修改后只是精确了字符集,并非是必要的。不清楚在其他系统下有没有这样的问题。

中文输入法

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

原文 : http://giskel.blog.163.com/blog/static/7166004520138384747352/

时间: 2024-10-12 01:19:55

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

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

(一)分页栏英文改中文解决方案 这个问题其实很简单,就是引入文件jquery-easyui-1.3/locale/easyui-lang-zh_CN.js . 注意这个文件要放在本页js的后面,放在最后也不会有什么影响的. 其实日期控件引入这个文件也可以把英文变为中文. 还有一种比较笨的解决办法 ,如下: 1 //设置分页控件 2 var p = $('#list_data').datagrid('getPager'); 3 $(p).pagination({ 4 pageSize: 10,//

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

CactiEZ中文版是最简单有效的Cacti中文解决方案,整合Spine,RRDTool和美化字体.集成Thold,Monitor,Syslog,Weathermap,Realtime,Errorimage,Mobile,Aggregate以及Apache,Squid,F5,Nginx,MySQL等模板.支持多种硬盘控制器和阵列卡,基于CentOS6,启动速度更快,支持EXT4文件系统,原生rsyslog更稳定.全中文页面,中文图形,支持邮件报警,支持声音报警,安装方便使用简单. 说明:Cact

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

简述 目前网上已经有很多种html文件直接转pdf的技术帖子,但是很少有直接将部分html作为段落插入到pdf中,而且也没有一个可以很好的解决中文显示的问题. 因此今天上午围绕这个问题进行了研究,把解决方案分享给大家. itextpdf基础操作请访问:http://www.cnblogs.com/mvilplss/p/5640598.html 感谢:http://gridmix.blog.51cto.com/4764051/1229585 实现思路 如果想插入html片段,我们使用一个类的静态方

Cookie不能保存中文解决方案

 在用cookie保存用户名的时候,发现cookie值不能存中文,报如下错: Control character in cookie value, consider BASE64 encoding your value 错误发生在:response.addCookie(cookie); 在以前的编程中也碰到过这样的问题,主要是cookie值里面存在非法参数,如存在"\r\n"."\n"之类的字符时就报报这样的错,但我就个用户名啊,不存在像这些字符啊,不管,我把c

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

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

中文路径-接口路径url不能传输中文解决方案

服务端:

WordPress英文主题不显示中文的原因:Cufon字体特效

经常会有WordPress英文主题不显示文章标题,其原因是英文主题设计者喜欢用Cufon字体特效,从而导致中文无法显示,Cufon字体特效js代码主要是将文字以图片的方式显示出来,但是其缺点是:只支持英文字符和数字,其他文字只能和他说拜拜了,中文也不例外,下面我们看看Cufon字体特效究竟是何方神圣. 什么是Cufon? Cufon 是一个用来替代 sIFR 框架,实现在网页中对文字字体进行渲染功能的纯 JavaScript 开源类库(cufon-yui.js). 为什么要用Cufon 在web

从传输流收到意外的 eof 或 0 个字节 win2003 解决方案。

前奏就不罗嗦了,相信看到此文的人一定已经知道该问题在何时发生. 本文是针对win2003及以下系统的,高版本系统若发生此问题,必定不是如下原因.可以尝试设置SslProtocols.Ssl3. OpenSSL 支持几个 128 位和 256 位 AES 密码套件.OpenSSL 中最开放的软件产品,在 Unix 系统上使用.例如,Sendmail. 后缀. Firefox 和 Thunderbird 中使用 OpenSSL.目前,相互提供的仅是 128 位加密套件是 RC4.没有任何的 256

Linux下的TeXlive 2015 中文问题

据说可实现Linux下TeXlive中英混排的方法: 1. 本方法来自http://seisman.info/mini-template-for-xeCJK.html xeCJK + xeLaTeX,这大概是目前为止最优的中文解决方案. \documentclass{article} \usepackage{xeCJK} xeCJK将默认使用TeXLive自带的Fandole字体.要能够编译通过,需要将TeXLive自带的中文字体安装到系统中,最简单的办法是在~/.fonts目录下建一个软链接: