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

7

我有一些以多字节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标题中的“dash”字符实际上是一个半角日语字符,这就是在这种情况下破坏wprintf函数的原因。
我尝试使用“%-32lS”,但这会将垃圾打印到控制台中,并且我尝试使用小写“s”,但这也会打印垃圾。有什么办法可以在多字节字符的情况下获得固定宽度的打印输出呢?
编辑:
以下是内存中显示titleUDF变量及其包含的冒犇THPS2字符串字节的屏幕截图:enter image description here 如您所见,“dash”字符表示为0xef 0xbd 0xb0。值得注意的是,我必须调用:
SetConsoleCP(65001);
SetConsoleOutputCP(65001);

为使多字节字符正常显示,我必须更改控制台中的字体为具有这些字符的字形的字体。我使用NSimSun。

你能提供有问题的字符的代码点或者至少在这里写下来,以便我们可以复制和粘贴吗? - Serge Ballesta
@SergeBallesta 请看我的编辑 - Jaska
1个回答

0

我认为,你将无法修复wprintf函数(或将编写完整版本的wprintf函数)。所以,只有简单/粗略的解决方案 :( :

void PrintFilenameLine(const wchar_t* line1, const wchar_t* line2, const wchar_t* line3) {
  // Detect sizes of lines
  // Generate output string
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接