所以我有这个使用此代码写入数据文件的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 ++编译器如何处理这个?
答案 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中的字符(拉丁文+数字+'普通'标点符号以及你在英文键盘上可以找到的任何字符+控制字符),你应该不在乎 - 它会工作在任何语言环境中。否则,请明确设置区域设置并使用宽字符(但据我所知,在您的情况下,没有必要)。