printf中的宽度说明符与重音字符无法正常工作

Eri*_*öök 7 c printf

我正在尝试使用宽度说明符和printf函数格式化c中某些字符串的输出.但是我无法获得我想要的行为.似乎每次printf遇到字符å,ä或ö时,为字符串保留的宽度会缩小一个位置.

代码片段说明:

#include <stdio.h>

int main(void)
{
  printf(">%-10s<\n", "aoa");
  printf(">%-10s<\n", "aäoa");
  printf(">%-10s<\n", "aäoöa");
  printf(">%-10s<\n", "aäoöaå");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的ubuntu linux bash-shell中输出.

>aoa       <
>aäoa     <
>aäoöa   <
>aäoöaå <
Run Code Online (Sandbox Code Playgroud)

我正在寻找有关如何处理这个问题的建议.我想要的是上面代码片段中的所有字符串都在空格填充的10字符宽字段中打印,如下所示:

>aoa       <
>aäoa      <
>aäoöa     <
>aäoöaå    <
Run Code Online (Sandbox Code Playgroud)

如果这不是其他设置的问题,我也很感激有关为什么会发生这种情况或反馈的任何见解.

Flo*_*opp 6

使用宽字符串和wprintf:

#include <cwchar>
#include <locale.h>

int main(void)
{
  // seems to be needed for the correct output encoding
  setlocale(LC_ALL, "");

  wprintf(L">%-10ls<\n", L"aoa");
  wprintf(L">%-10ls<\n", L"aäoa");
  wprintf(L">%-10ls<\n", L"aäoöa");
  wprintf(L">%-10ls<\n", L"aäoöaå");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*eri 6

为什么会这样?

看看绝对最低每个软件开发人员,绝对必须知道Unicode和字符集

作为宽字符和UTF8的替代方法,您可以使用此函数计算非ASCII字符的数量,然后,您可以将结果添加到宽度说明符printf:

#include <stdio.h>

int func(const char *str)
{
    int len = 0;

    while (*str != '\0') {
        if ((*str & 0xc0) == 0x80) {
            len++;
        }
        str++;
    }
    return len;
}

int main(void)
{
    printf(">%-*s<\n", 10 + func("aoa"), "aoa");
    printf(">%-*s<\n", 10 + func("aäoa"), "aäoa");
    printf(">%-*s<\n", 10 + func("aäoöa"), "aäoöa");
    printf(">%-*s<\n", 10 + func("aäoöaå"), "aäoöaå");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

>aoa       <
>aäoa      <
>aäoöa     <
>aäoöaå    <
Run Code Online (Sandbox Code Playgroud)