我正在编写一些单元测试,用于验证我们处理各种使用除普通拉丁字母之外的其他字符集的资源:Cyrilic,Hebrew等.
我遇到的问题是我找不到在测试源文件中嵌入期望的方法:这是我正在尝试做的一个例子......
/// /// Protected: TestGetHebrewConfigString /// void CPrIniFileReaderTest::TestGetHebrewConfigString() { prwstring strHebrewTestFilePath = GetTestFilePath( strHebrewTestFileName ); CPrIniFileReader prIniListReader( strHebrewTestFilePath.c_str() ); prIniListReader.SetCurrentSection( strHebrewSubSection ); CPPUNIT_ASSERT( prIniListReader.GetConfigString( L"?????????" ) == L"????????") ); }
这根本不起作用.以前我使用一个宏调用一个例程将一个窄字符串转换为一个宽字符串(我们在应用程序中使用towstring所以它是现有代码)
#define UNICODE_CONSTANT( CONSTANT ) towstring( CONSTANT ) wstring towstring( LPCSTR lpszValue ) { wostringstream os; os << lpszValue; return os.str(); }
上面测试中的断言变为:
CPPUNIT_ASSERT( prIniListReader.GetConfigString( UNICODE_CONSTANT( "?????????" ) ) == UNICODE_CONSTANT( "????????" ) );
这在OS X上工作正常,但现在我正在移植到linux,我发现测试都失败了:它们都感觉相当hackish.任何人都能告诉我他们是否有更好的解决方案来解决这个问题?
一种繁琐但可移植的方法是使用数字转义码来构建字符串.例如:
wchar_t *string = L"?????????";
变为:
wchar_t *string = "\x05d3\x05d5\x05e0\x05d3\x05d0\x05e8\x05df\x05de\x05e2";
您必须将所有Unicode字符转换为数字转义符.这样您的源代码就变得与编码无关.
您可以使用在线工具进行转换,例如此工具.它输出JavaScript的转义格式\uXXXX
,所以只是搜索和替换\u
使用\x
,以获得C画幅.
您必须告诉GCC您的文件使用哪种编码来将这些字符编码到文件中.
-finput-charset=charset
例如,使用该选项-finput-charset=UTF-8
.然后,您需要告诉它在运行时用于这些字符串文字的编码.这将确定字符串中wchar_t项的值.-fwide-exec-charset=charset
例如,您可以使用该编码进行设置-fwide-exec-charset=UTF-32
.请注意编码的大小(utf-32需要32位,utf-16需要16位)不得超过wchar_t
gcc使用的大小.
你可以调整它.该选项主要用于编译程序wine
,旨在与Windows兼容.该选项被调用-fshort-wchar
,很可能是16位而不是32位,这是它在linux上gcc的通常宽度.
这些选项man gcc
在gcc联机帮助页中有更详细的描述.