查看: 2874|回复: 16

中文显示有问题

[复制链接]

该用户从未签到

发表于 2009-3-11 10:10:34 | 显示全部楼层 |阅读模式
最近在做中文字体显示时总是出问题。如果用常量字符串,则可以正常显示,如setText(L"中文显示!");但如果通过字符串变量传递数据进行显示,就会出问题,不能正常显示,如
std::string   str;
str = "中文显示!";
setText(L(str));

请高手指点一下,怎样才能正确显示。谢谢

该用户从未签到

发表于 2009-3-11 10:29:54 | 显示全部楼层
可以直接设置Win32程序的本地编码页,使用setlocale函数,中文的代码页好像是".936"

该用户从未签到

发表于 2009-3-11 20:02:27 | 显示全部楼层
用MultiByteToWideChar 函数

该用户从未签到

 楼主| 发表于 2009-3-12 18:31:28 | 显示全部楼层
谢谢,回去试一下

该用户从未签到

 楼主| 发表于 2009-3-13 18:53:45 | 显示全部楼层
array能不能详细地讲述一下setlocale的用法,我用的MFC单文档,不知道该怎么使用setlocale,新手上路,请多多指教,谢谢

该用户从未签到

发表于 2009-3-13 19:23:56 | 显示全部楼层
可以查MSDN文档,这个函数不是OSG的:
setlocale( LC_ALL, ".936" );
我记得这么做就可以

该用户从未签到

发表于 2009-3-13 20:04:56 | 显示全部楼层
std::wstring MultibyteToWide(const std::string& multibyte)
        {
                size_t length = multibyte.length();
                if (length == 0)
                        return wide_string();
               
                wchar_t * wide = new wchar_t[multibyte.length()*2+2];
                if (wide == NULL)
                        return wide_string();
                int ret = (int)MultiByteToWideChar(CP_ACP, 0, multibyte.c_str(), (int)multibyte.size(), wide, (int)length*2 - 1);
                wide[ret] = 0;
                wide_string str = wide;
                delete[] wide;
                return str;
        }


std::string   str;
str = "中文显示!";
std::wstring wstr=MultibyteToWide(str)
setText(wstr.c_str() );

该用户从未签到

发表于 2009-3-15 10:08:42 | 显示全部楼层

回复 7楼 的帖子

kinsung

你能不能具体说一下如何用啊?
怎么你上边的代码编译出现好多问题?
我在Win32工程下边
wide_string根本不认识
这个是什么类型的变量,需要包含什么头文件?
多谢了

[ 本帖最后由 kangsite 于 2009-3-15 10:25 编辑 ]

该用户从未签到

发表于 2009-3-15 10:15:01 | 显示全部楼层

回复 楼主 的帖子

请问zhangsai
你的中文显示的问题解决了么?
能共享一下么?

该用户从未签到

发表于 2009-3-15 10:58:45 | 显示全部楼层
wide_string 就是 std::wstring
具体用法已经有例子了啊。
就是把多字节编码的字符串通过MultiByteToWideChar转为unicode编码。

std::string   str;
str = "中文显示!";
std::wstring wstr=MultibyteToWide(str)
setText(wstr.c_str() );

该用户从未签到

发表于 2009-3-15 12:05:01 | 显示全部楼层

回复 10楼 的帖子

MultiByteToWideChar这个函数是那里的??需要包含那个头文件啊?
以前没有用过

[ 本帖最后由 kangsite 于 2009-3-15 12:31 编辑 ]

该用户从未签到

发表于 2009-3-15 12:40:09 | 显示全部楼层

回复 10楼 的帖子

可以了。。
多谢了。。kinsung

但是这种方法仅仅是对中文的



准确的是:
#include <tchar.h>
#include <wchar.h>
#include <string.h>
#include <windows.h>

std::wstring MultibyteToWide(const std::string& multibyte)
{
        size_t length = multibyte.length();
        if (length == 0)
                return std::wstring();

        wchar_t * wide = new wchar_t[multibyte.length()*2+2];
        if (wide == NULL)
                return std::wstring();
        int ret = MultiByteToWideChar(CP_ACP, 0, multibyte.c_str(), (int)multibyte.size(), wide, (int)length*2 - 1);
        wide[ret] = 0;
        std::wstring str = wide;
        delete[] wide;
        return str;
}

[ 本帖最后由 kangsite 于 2009-3-15 13:44 编辑 ]

该用户从未签到

 楼主| 发表于 2009-3-15 15:42:10 | 显示全部楼层
问题已经解决,谢谢大家的帮助

该用户从未签到

发表于 2009-4-13 23:53:26 | 显示全部楼层
MultiByteToWideChar 是不是Windows API
如果要在linux下用怎么搞?

该用户从未签到

发表于 2009-4-13 23:56:28 | 显示全部楼层
说句牢骚话:C/C++对Unicode的支持也太差了 !!!.
虽然是从c++开始学习程序设计的.但是用C#和java的时间较长了。现在回头再来用C++,发现C++的设计太丑了. 整个语言就是个地雷坑  走哪都可能踩地雷.

该用户从未签到

发表于 2009-4-14 00:36:27 | 显示全部楼层
:L :L

该用户从未签到

发表于 2009-11-5 15:41:47 | 显示全部楼层
:L:L:L:L:L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表