1

这是场景:

  • 我只能使用char*字符串的数据类型,不能wchar_t *
  • 我的 MS Visual C++ 编译器必须设置为 MBCS,而不是 UNICODE,因为我拥有的第三方源代码正在使用 MBCS;将其设置为 UNICODE 将导致数据类型问题。
  • 我正在尝试在需要获取字符串以便正确打印的打印机上打印中文字符

我应该如何处理这一行以使代码正确:char * str = "你好";

也许将其转换为十六进制序列?如果是,如何?非常感谢。

char * str = "你好";
size_t len = strlen(str) + 1;


wchar_t * wstr = new wchar_t[len];
size_t convertedSize  = 0;
mbstowcs_s(&convertedSize, wstr, len, str, _TRUNCATE);
cout << convertedSize;

if(! ExtTextOutW(resource->dc, 1,1 , ETO_OPAQUE, NULL, wstr ,  convertedSize, NULL))
{
  return 0;
}

更新:让我们以另一种方式提出问题

我有这个,char * str 包含 UTF-8 代码单元序列,对于 2 个汉字你好,ExtTextOutW 仍然无法正确执行 wstr,因为我认为我的 mbstowcs_s 代码仍然无法正常工作。知道为什么吗?

char * str = "\xE4\xBD\xA0\xE5\xA5\xBD";    
    size_t len = strlen(str) + 1;
    wchar_t * wstr = new wchar_t[len];
    size_t convertedSize  = 0;
    mbstowcs_s(&convertedSize, wstr, len, str, _TRUNCATE);
    if(! ExtTextOutW(resource->dc, 1,1 , ETO_OPAQUE, NULL,  wstr ,  len, NULL))
    {
        return 0;
    }
4

2 回答 2

2

事实是,你好是一个 Unicode 字符序列。您将需要使用 Unicode 字符集以确保其正确显示。

唯一可能的例外是,如果您使用的多字节字符集在基本字符集中包含这两个字符。既然您说您无论如何都无法为 MBCS 进行编译,那可能是一个解决方案。为了使其工作,您必须将系统语言设置为包含此字符的语言。您执行此操作的确切方式会在每个操作系统版本中发生变化。我认为他们正在尝试“改进”它。至少在 Windows 7 上,他们称之为“非 Unicode 程序的语言”设置,可在“区域和语言”控制面板中访问。

如果没有将这些字符作为基本字符集的一部分提供的系统语言,那么您基本上就不走运了。

即使您尝试使用使用该char数据类型的 UTF-8 编码(Windows 本身不支持,而是更喜欢 UTF-16 来支持其 Unicode),很可能您正在连接的任何其他应用程序/库with 将无法处理它。Windows 应用程序假定 achar包含当前 ANSI/MB 字符集中的字符。Unicode 字符在 a 中wchar_t,并且由于您不能使用它,这表明该应用程序根本不支持 Unicode。(顺便说一句,这意味着它已经坏了——是时候升级了。)

于 2013-04-12T06:31:12.817 回答
0

作为对 MYMNeo 所说的改编,我建议这样做可行:

wchar_t *str = L"你好";
fputws(str, stdout);

附言。这可能不是 C: cout << convertedSize;

于 2013-04-12T04:01:26.463 回答