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
现在的问题是,怎样保证我传入的是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);
好了,问题解决!