标签: multibyte-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");
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

THPS2 标题中的“破折号”字符实际上是一个半角日文字符,这就是在这种情况下破坏 wprintf 功能的原因。

我试过使用 "%-32lS" 但这会向控制台打印垃圾,我试过小写的 "s" 但这也会打印垃圾。即使使用多字节字符,如何获得固定宽度打印的任何想法?

编辑:

这是一个屏幕截图,显示了内存中的 titleUDF 变量,以及有问题的“THPS2”字符串字节:

在此处输入图片说明

如您所见,“破折号”字符表示为 0xef 0xbd 0xb0

值得注意的是,我必须调用:

SetConsoleCP(65001);
SetConsoleOutputCP(65001);
Run Code Online (Sandbox Code Playgroud)

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

c++ printf fixed-width multibyte-characters

7
推荐指数
1
解决办法
105
查看次数

使用多字节字符集的MFC应用程序中的UTF-8文本

我正在开发一个应用程序,该应用程序接收以UTF-8编码的文本,并且需要在某些MFC控件上显示它。该应用程序是使用MultiByte字符集(MBCS)构建的,并且假定这不能更改。

我希望如果将接收自UTF-8的文本转换为宽字符字符串,则可以使用该SetWindowTextW方法正确显示它。为此,我使用了一个玩具应用程序,该应用程序从文件中读取输入并设置控件的文本。

std::wstring utf8_decode(const std::string &str)
{
    if (str.empty()) return std::wstring();
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

BOOL CAboutDlg::OnInitDialog()
{
    std::vector<std::string> texts;
    texts.resize(6);
    std::fstream f("D:\\code\\sample-utf8.txt", std::ios::in);
    for (size_t i=0;i<6;++i)
        std::getline(f, texts[i]);

    ::SetWindowTextW(GetDlgItem(IDC_BUTTON1)->m_hWnd, utf8_decode(texts[0]).c_str());
    ::SetWindowTextW(GetDlgItem(IDC_BUTTON2)->m_hWnd, utf8_decode(texts[1]).c_str());
    ::SetWindowTextW(GetDlgItem(IDC_BUTTON3)->m_hWnd, utf8_decode(texts[2]).c_str());
    ::SetWindowTextW(GetDlgItem(IDC_BUTTON4)->m_hWnd, utf8_decode(texts[3]).c_str());
    ::SetWindowTextW(GetDlgItem(IDC_BUTTON5)->m_hWnd, utf8_decode(texts[4]).c_str());
    ::SetWindowTextW(GetDlgItem(IDC_BUTTON6)->m_hWnd, utf8_decode(texts[5]).c_str());
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

用MBCS构建玩具应用程序后,我没有得到想要的东西。 在此处输入图片说明

我使用unicode构建应用后,一切正常 在此处输入图片说明

这是否意味着在使用MBCS进行构建时就没有希望将unicode文本用于各个控件?如果可能的话,您能给我指点吗?谢谢。

c++ unicode mfc utf-8 multibyte-characters

5
推荐指数
1
解决办法
251
查看次数

在C++中,sizeof('ab')是否等于sizeof(int)?

考虑到我有以下程序来确定多字节字符的大小.

#include<iostream>

int main()
{
   std::cout<<"size of multibyte characters : "<<sizeof('ab')<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我的GCC编译器输出为4.

所以我有以下问题:

  • 多字节字符文字的大小是多少?
  • sizeof('ab')等于sizeof(int)

c++ sizeof c++11 multibyte-characters

3
推荐指数
1
解决办法
211
查看次数

标签 统计

c++ ×3

multibyte-characters ×3

c++11 ×1

fixed-width ×1

mfc ×1

printf ×1

sizeof ×1

unicode ×1

utf-8 ×1