簡體   English   中英

打印包含多字節字符的固定寬度字符串

[英]Printing fixed width strings that contain multi-byte characters

我有一些以多字節 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 函數在計算寬度時包括多字節字符的每個字節。 請參閱下面的輸出:

在此處輸入圖片說明

THPS2 標題中的“破折號”字符實際上是一個半角日文字符,這就是在這種情況下破壞 wprintf 功能的原因。

我試過使用 "%-32lS" 但這會向控制台打印垃圾,我試過小寫的 "s" 但這也會打印垃圾。 即使使用多字節字符,如何獲得固定寬度打印的任何想法?

編輯:

這是一個屏幕截圖,顯示了內存中的 titleUDF 變量,以及有問題的“THPS2”字符串字節:

在此處輸入圖片說明

如您所見,“破折號”字符表示為 0xef 0xbd 0xb0

值得注意的是,我必須調用:

SetConsoleCP(65001);
SetConsoleOutputCP(65001);

使多字節字符正確顯示。 此外,我必須將控制台中的字體更改為具有這些字符的字形的字體。 我使用 NSimSun。

我認為,您將無法修復 wprintf(或將編寫完整版本的 wprintf)。 所以,有一個簡單/粗略的解決方案:(:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM