osg osgText::Text 中文乱码问题修复 解决中
#include <osgDB/ConvertUTF>
osg::Camera* osgWidget::createTextHUD()
{
osgText::Font* fontHei = osgText::readFontFile("Fonts/simkai.ttf");
text->setFont(fontHei);
// 步骤二:设置 文字颜色: 红色, 透明度有效(opengl需要额外开启透明通道)
text->setColor(osg::Vec4f(1.0, 1.0, 1.0, 1.0));
// pText->setColor(osg::Vec4f(1.0, 1.0, 1.0, 0.2));
// 步骤三:设置 文字位置(设置文字框的中心点的坐标)
text->setPosition(osg::Vec3f(0, 0, 0));
// 步骤四:设置 文字方向
//text->setAxisAlignment(osgText::Text::XZ_PLANE);
// 步骤五:设置 大小模式(测试当前没发现有什么区别)
text->setCharacterSizeMode(osgText::Text::OBJECT_COORDS);
// pText->setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
// pText->setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT);
// 步骤六:设置 分辨率
text->setFontResolution(50, 50);
// 步骤七:设置 对齐方式
text->setAlignment(osgText::Text::LEFT_CENTER);
// 步骤八:设置 输出格式
text->setLayout(osgText::Text::LEFT_TO_RIGHT);
// pText->setLayout(osgText::Text::RIGHT_TO_LEFT);
// pText->setLayout(osgText::Text::VERTICAL);
// 步骤九:设置 绘制模式
// pText->setDrawMode(osgText::Text::TEXT);
// pText->setDrawMode(osgText::Text::BOUNDINGBOX);
// pText->setDrawMode(osgText::Text::FILLEDBOUNDINGBOX);
// pText->setDrawMode(osgText::Text::ALIGNMENT);
// 步骤十:设置 背景类型
// pText->setBackdropType(osgText::Text::DROP_SHADOW_BOTTOM_RIGHT);
// pText->setBackdropType(osgText::Text::DROP_SHADOW_CENTER_RIGHT);
// pText->setBackdropType(osgText::Text::DROP_SHADOW_TOP_RIGHT);
// pText->setBackdropType(osgText::Text::DROP_SHADOW_BOTTOM_CENTER);
// pText->setBackdropType(osgText::Text::DROP_SHADOW_TOP_CENTER);
// pText->setBackdropType(osgText::Text::DROP_SHADOW_BOTTOM_LEFT);
// pText->setBackdropType(osgText::Text::DROP_SHADOW_CENTER_LEFT);
// pText->setBackdropType(osgText::Text::DROP_SHADOW_TOP_LEFT);
// pText->setBackdropType(osgText::Text::OUTLINE);
text->setBackdropType(osgText::Text::NONE);
// 步骤十一:设置 颜色倾斜模式
text->setColorGradientMode(osgText::Text::SOLID);
// pText->setColorGradientMode(osgText::Text::PER_CHARACTER);
// pText->setColorGradientMode(osgText::Text::OVERALL);
// 以上部分属性是默认的,可以不设置,此处为阅读都写出来
QString version = "V1.16.0";
QString textString = QString("OsgDemo %1(渲染中文文字)").arg(version);
std::string str = osgDB::convertStringFromCurrentCodePageToUTF8(textString.toStdString());
text->setText(str, osgText::String::ENCODING_UTF8);
//
//压入顶点
osg::Vec3Array *vecArray = new osg::Vec3Array;
vecArray->push_back(osg::Vec3(0.0, 0.0, 0.0));
vecArray->push_back(osg::Vec3(200.0, 0.0, 0.0));
vecArray->push_back(osg::Vec3(200.0, 100.0, 0.0));
vecArray->push_back(osg::Vec3(0.0, 100.0, 0.0));
geometry->setVertexArray(vecArray);
//法线
osg::Vec3Array *vecNorm = new osg::Vec3Array;
vecNorm->push_back(osg::Vec3(0.0, 0.0, 1.0));
geometry->setNormalArray(vecNorm);
geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
//设置纹理
osg::Vec2Array *vec2Coord = new osg::Vec2Array;
vec2Coord->push_back(osg::Vec2(0.0, 0.0));
vec2Coord->push_back(osg::Vec2(1.0, 0.0));
vec2Coord->push_back(osg::Vec2(1.0, 1.0));
vec2Coord->push_back(osg::Vec2(0.0, 1.0));
geometry->setTexCoordArray(0, vec2Coord);
osg::DrawArrays *drawArrays = new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4);
//drawArrays->setPrimitiveSet(0,drawArrays1);
geometry->addPrimitiveSet(drawArrays);
osg::Image* image = osgDB::readImageFile("############.jpg");
osg::Texture2D* texture2d = new osg::Texture2D;
texture2d->setDataVariance(osg::Object::DYNAMIC);
texture2d->setImage(image);
geometry->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture2d, osg::StateAttribute::ON);
//关闭灯光
geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
//geode->addDrawable(geometry);
geode->addDrawable(text);
camera->addChild(geode);
return camera;
}
看似中文 其实是乱码
而0xEFBFBDEFBFBD被GBK解码时,正好就是锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。
而 GBK 编码依然采用双字节编码方案,因此上面的 6 字节0xEFBFBDEFBFBD,就被拆成了 3 个 2 字节字符即0xEFBF, 0xBDEF, 0xBFBD 对应 GBK 编码里面就是:锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。
参考文章
Python模拟锟斤拷等各类乱码_python 锟斤拷锟斤拷_小小明-代码实体的博客-CSDN博客
Qt中UTF-8和GBK字符数据之间的相互转换_qt utf8转gbk_WingkinO的博客-CSDN博客
QT utf8编码与gbk编码的相互转换 - 代码先锋网
1 分钟带你认识从 "�" 到 "锟斤拷"_编码