解决osgEarth中文显示乱码的几种方法
在此感谢那些在路上那个帮助过别人的朋友,谢谢。
方法一:
通过自己写函数转换类型。
下面这三个函数先复制过去吧。
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);
}
接下来把需要显示的中文进行如下转换便可以使用了。
std::string _strName;
_strName = "你好";
std::string _strWideName;
gb2312ToUtf8(_strName,_strWideName)
-------------等等还是乱码。好吧的确有可能还是乱码,这里需要设置字体样式:
Style pin;
pin.getOrCreate<IconSymbol>()->url()->setLiteral("D:/osgearth/OSGOK/data/placemark32.png");//指定标注图片路径
pin.getOrCreate<osgEarth::Symbology::TextSymbol>()->font()="C:/Windows/Fonts/simhei.ttf";//指定中文字体路径
pin.getOrCreate<osgEarth::Symbology::TextSymbol>()->encoding() = osgEarth::Symbology::TextSymbol::ENCODING_UTF8;
pin.getOrCreate<TextSymbol>()->alignment() = TextSymbol::ALIGN_CENTER_CENTER;
pin.getOrCreate<TextSymbol>()->fill()->color() = Color::Red;
root->addChild( new PlaceNode(mapNode, GeoPoint(mapNode->getMapSRS(), 117.5, 39.38), _strWideName , pin));
把这个字体样式加上就可以成功显示中文了,好了吧。
方法二:
这是一种很酷炫的方法(其实跟方法二差不多啦)。
方法就是利用Qt的函数来处理中文,代码很简单,如下:
QString name="你好";
std::string _strWideName = std::string(name.toUtf8());
--------------等等别忘记额,这种方法任然需要设置字体样式(跟方法二相同)。
方法三:
修改源码重新编译。好吧,这种方式一劳永逸(网上有很多重新编译的需要修改源码的案例),这里我就不多做累述。
无图无真相: