printf格式的非ascii字符的正确行为是什么?

时间:2018-03-17 10:13:28

标签: c mingw

所以我有这个使用此代码写入数据文件的c程序。

  fprintf(fo,"\xbf%06d",num) ;

它工作正常,但在某些中国电​​脑上,它的表现不同。 我在C中做了一个小测试程序,并在borland C和mingw中编译。

#include <stdio.h>

void main(void)  {
  int i = 0 ;
  unsigned char b[100] ;
  sprintf(b,"\xbf%d",12345) ;
  printf("\n%s\n",b) ;
  while (b[i]) 
    printf(" %02X",b[i++]) ;
  printf("\n") ;
}
在我的电脑上

输出是:

┐12345
BF 31 32 33 34 35

但如果我让我的中国客户在他的电脑上测试它,它对Borland版本的工作方式不同: 输出是:

?d
 BF 25 64

显然是xbf和?合并为一个汉字。

在中国,用mingw编制的节目输出是:

?2345
 BF 31 32 33 34 35

这里格式一次解析一个字节。

哪一个是正确的行为? 其他C / C ++编译器如何处理这个?

2 个答案:

答案 0 :(得分:0)

我不知道您的Borland编译器发生了什么,但是使用宽字符来处理像中文这样的扩展字符:

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

int main(void) 
{
    int i = 0 ;
    wchar_t b[100] ;

    setlocale(LC_ALL, "");
    swprintf(b, 100, L"\xbf%d", 12345);
    wprintf(L"\n%s\n", b);
    while (b[i]) 
        wprintf(L" %02X", b[i++]);
    wprintf(L"\n");
    return 0;
}

答案 1 :(得分:0)

在第一种情况下,您的控制台输出似乎使用cp ****(一个字节=一个字符)编码,而在第二种情况下,它使用UTF8编码。请注意,0xbf字节代码(以及127以上的任何字节代码)需要消耗下一个或多个字节,以便为相同UTF8编码字符的代码提供额外的位。

做什么取决于你的任务。如果你真的不需要打印任何未包含在ascii-128中的字符(拉丁文+数字+'普通'标点符号以及你在英文键盘上可以找到的任何字符+控制字符),你应该不在乎 - 它会工作在任何语言环境中。否则,请明确设置区域设置并使用宽字符(但据我所知,在您的情况下,没有必要)。