告诉你如何在SDL中使用中文
sdl吧
全部回复
仅看楼主
level 1
wqzhishou 楼主
首先,你要明白这样一个事实,SDL只接收UTF-8编码的字符串。所以,只要能保证你传入的是UTF-8字符串,管你什么语言,一率能够正常显示(好吧,基本上是这样)。
现在的问题是,怎样保证我传入的是UTF-8字符串。
我们假设我们所使用的是C++。C++11以前,没有定义字符串编码的概念。所以,你所写的字符串的编码取决于你所用的编译器。GCC中,所有源文件会当作被UTF-8编码,所以,在GCC中,你可以直接写这样的东西,SDL_CreateWindow("我是窗口")(也就是说,Linux及Mingw用户不用住下看了)。而这VC中,所有源文件会被转换成当前系统所使用的字符编码。这是麻烦之源。
在C++11中,定义了utf-8字符串,也就是说,你可以这么写:SDL_CreateWindow(u8"我是窗口")。然而,讽刺的是,GCC 8.x已经支持了这种用法,而VS 2013仍然没有支持这种用法。于是,我们只能再用其他的用法。
实际上,我们可以用文件中读入utf-9字符串,但相信这不是大家所想要的,大家都想要直接在源文件中写出来。好吧,最后的方法是:
C++中,char类型没有定义其编码,然后,wchar_t却定义了编码,它保证是某种unicode编码。在Linux下,是UCS-4/UTF-32。而在Windows下,是UTF16(大端还是小端我不记得了)。所以,我们可以这样写:
wchar_t* title = L"我是窗口”;
这样,title保证是一个Unicode字符串(不管什么平台)。我们只需要将其转换成utf-8即可。这是比较简单的。我使用的是Boost.Locale。
char* u8_str = boost::locale::conv::utf_to_utf<char>(title);
SDL_CreateWindow(u8_str);
好吧,似乎还是有些坑。如果你手头上没有什么跨平台的字符编码转换的库,你只能使用系统提供的了,不过,这就限制了跨平台。
wchar_t* title = L"窗口";
char str[1024] = {};
WideCharToMultiByte(
CP_UTF8,
0,
title,
-1,
str,
sizeof(str),
NULL,
NULL);
SDL_CreateWindow(str);
好了,问题解决!
2014年02月18日 04点02分 1
level 10
iconv不服
2014年02月18日 12点02分 2
vs默认没这个吧
2014年02月19日 12点02分
回复 scc__ :自己下载源码编译一下啊。又不麻烦。另外Mingw可以直接从installer安装这个库
2014年02月19日 12点02分
回复 御坂妹妹15842 :gcc+sdl没必要用这个库。vs只能编译windows程序也犯不上引入这个库。
2014年02月19日 12点02分
回复 scc__ :这种静态的字符串只要源码的编码转一下就好的说。vs可以配置编辑器使用的编码的。另外非要转码的话,用iconv就不用用什么widechartomultibyte了。
2014年02月19日 12点02分
level 8
2014年02月18日 14点02分 3
level 5
谁告诉你只能Utf-8了,Utf-16LE也没问题
2014年02月19日 15点02分 4
level 5
TTF_UnicodeBlended被你忽视了?
2014年02月19日 15点02分 5
貌似楼主只讨论了窗口标题的问题,没讨论ttf。
2014年02月20日 08点02分
level 9
看到GCC 8.x [冷]
2014年02月27日 14点02分 6
level 5
牛B 问题解决了 谢谢楼主
2018年07月28日 04点07分 9
level 3
以后肯定会用到,先顶
2018年08月25日 07点08分 10
1