C printf函数无法正确对齐包含土耳其语字符的字符串

时间:2019-03-01 13:03:21

标签: c text printf alignment

我有以下代码以左对齐格式在控制台上打印一些字符串:

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>

int main()
{
    printf("%s:\n", "Türkçe karakterler ile");
    printf("%-14s: \n", "Onaltılık");
    printf("%-14s: \n", "Onluk");
    printf("%-14s: \n", "İkilik");

    printf("\n%s:\n", "Türkçe karakterler olmadan");
    printf("%-14s: \n", "Onaltilik");
    printf("%-14s: \n", "Onluk");
    printf("%-14s: \n", "Ikilik");
}

我在Ubuntu 18.04系统上同时使用gcc(7.3.0)和clang(6.0.0)编译了这段代码。

输出如下:

Türkçe karakterler ile:
Onaltılık  : 
Onluk        : 
İkilik      : 

Türkçe karakterler olmadan:
Onaltilik     : 
Onluk         : 
Ikilik        :

从第一组字符串的代码中可以看出,其中有一些土耳其语字符,例如“ı”和“İ”。第二组字符串中没有土耳其语字符。

对于包含土耳其语字符的字符串,printf函数的输出未正确对齐。预期的输出是:

Türkçe karakterler ile:
Onaltılık     : 
Onluk         : 
İkilik        : 

Türkçe karakterler olmadan:
Onaltilik     : 
Onluk         : 
Ikilik        :

如果我在带有gcc(CodeBlocks 17.2中的MinGW v5.1.1)的Windows系统(Windows 7)上编译相同的代码,则输出正确如下:

Türkçe karakterler ile:
Onaltılık     :
Onluk         :
İkilik        :

Türkçe karakterler olmadan:
Onaltilik     :
Onluk         :
Ikilik        :

有人可以帮我找出问题所在吗?

1 个答案:

答案 0 :(得分:2)

我的猜测是,因为您的编辑器使用UTF-8(一种多字节编码)保存了源。 printf函数家族仅处理 byte 字符串。这意味着printf将把每个非ASCII字符计为多个字符。

如果是这样,可以通过打印字符串来解决此问题,然后在打印空字符串时使用*修饰符后手动添加填充。 *修饰符允许您将宽度作为参数传递给printf

类似这样的东西:

printf("%s%*s: \n", "Onaltılık", 5, "");  // 5 = 14 - 9, where 9 is the number of "characters" in Onaltılık
printf("%s%*s: \n", "Onluk"    , 9, "");  // Dito for Onluk
printf("%s%*s: \n", "İkilik"   , 8, "");  // Dito for İkilik

输出:

Onaltılık     : 
Onluk         : 
İkilik        :