[英]setw() imbues wrong output on strings containing UTF-8 multi-byte characters/code points
[英]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.