10

我正在编写一些单元测试,这些测试将验证我们对使用除普通拉丁字母之外的其他字符集的各种资源的处理:西里尔文、希伯来文等。

我遇到的问题是我找不到将期望嵌入到测试源文件中的方法:这是我正在尝试做的一个示例...

///
/// Protected: TestGetHebrewConfigString
///  
void CPrIniFileReaderTest::TestGetHebrewConfigString()
{
    prwstring strHebrewTestFilePath = GetTestFilePath( strHebrewTestFileName );
    CPrIniFileReader prIniListReader( strHebrewTestFilePath.c_str() );
    prIniListReader.SetCurrentSection( strHebrewSubSection );   

    CPPUNIT_ASSERT( prIniListReader.GetConfigString( L"דונדארןמע" ) == L"דונהשךוק") );
}

这根本行不通。以前我使用一个宏来解决这个问题,该宏调用一个将窄字符串转换为宽字符串的例程(我们在应用程序中到处都使用拖字符串,所以它是现有代码)

#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,我发现测试都失败了:这一切都让人感觉很不自然。谁能告诉我他们是否有更好的解决方案来解决这个问题?

4

3 回答 3

18

一种乏味但可移植的方法是使用数字转义码构建字符串。例如:

wchar_t *string = L"דונדארןמע";

变成:

wchar_t *string = "\x05d3\x05d5\x05e0\x05d3\x05d0\x05e8\x05df\x05de\x05e2";

您必须将所有 Unicode 字符转换为数字转义符。这样你的源代码就变得独立于编码了。

您可以使用在线工具进行转换,例如这个. 它输出 JavaScript 转义格式\uXXXX,因此只需搜索和替换\u即可\x获得 C 格式。

于 2009-01-14T13:39:13.863 回答
11

您必须告诉 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_tgcc 使用的大小。

你可以调整它。该选项主要用于编译程序wine,旨在与 Windows 兼容。该选项称为-fshort-wchar,并且很可能是 16 位而不是 32 位,这是 linux 上 gcc 的通常宽度。

man gcc这些选项在 gcc 手册页中有更详细的描述。

于 2009-01-14T12:26:08.673 回答
0
#define UNICODE_CONSTANT( CONSTANT ) towstring( CONSTANT )

wstring towstring( LPCSTR lpszValue ) {
    wostringstream os;
    os << lpszValue;
    return os.str(); 
}

这实际上根本不会在 Unicode 编码之间进行转换,这需要专门的例程。您需要保持源代码和数据编码统一——大多数人使用 UTF-8——然后在必要时将其转换为特定于操作系统的编码(例如 Winders 上的 UTF-16)。

于 2012-06-29T01:05:05.583 回答