打印包含多字节字符的定宽字符串

问题描述 投票:3回答:1

我有一些以多字节UTF8格式存储的字符串,我想将它们以固定宽度的空间打印到控制台。我这样做是:

wprintf(L"////////////// BLOCK 1 ///////////////   ////////////// BLOCK 2 ///////////////   ////////////// BLOCK 3 ///////////////\n");
wprintf(L"// %-32S //   // %-32S //   // %-32S //\n", mymemcard[0].filename, mymemcard[1].filename, mymemcard[2].filename);
wprintf(L"// %-32S //   // %-32S //   // %-32S //\n", mymemcard[0].titleUTF, mymemcard[1].titleUTF, mymemcard[2].titleUTF);
wprintf(L"//////////////////////////////////////   //////////////////////////////////////   //////////////////////////////////////\n\n");

文件名变量采用ASCII格式并且可以正常工作,但是如果titleUTF变量包含任何多字节字符,它们的打印时间将太短。我认为这是因为wprintf函数在计算宽度时包括多字节字符的每个字节。参见下面的输出:

enter image description here

THPS2标题中的“破折号”字符实际上是半角日语字符,在这种情况下,这就是打破wprintf函数的原因。

我已经尝试使用“%-32lS”,但是这会将垃圾信息输出到控制台,并且我已经尝试了小写的“ s”,但是这也会打印垃圾信息。关于如何使用多字节字符获得固定宽度打印的任何想法吗?

c++ printf fixed-width multibyte-characters
1个回答
0
投票

我认为,您将无法修复wprintf。所以,有一个简单/粗略的解决方案:(:

void PrintFilenameLine(const wchar_t* line1, const wchar_t* line2const wchar_t* line3) {
  // Detect sizes of lines
  // Generate output string
}
© www.soinside.com 2019 - 2024. All rights reserved.