以前没用过c语言读写unicode文件,想写一个这样的实验程序,结果程序编译还是正常的,但一执行就出错。于是写了一个简单的测试程序,编译就不通,我用的是MinGW Developer Studio,程序如下,请问是什么问题,谢谢
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <wctype.h>
#include <string.h>
int main(int argc, char *argv[])
{
wchar_t *cur_buff=L"你";
wprintf(cur_buff);
return 0;
}
//注:如果把"你"的赋值改成英文字符,程序的运行不会出现任何问题。
======================================================
sarrow的回复
编译器不支持.....
唯有换编译器....
或者用window的MFC中的TEXT...
======================================================
cracker007的回复
sarrow说得不是很对。
其实win32/mfc中的TEXT就是对L的一种扩展,实质上看到_UNICODE在stdafx的define之后会自动换成L宏。
并不是编译器不支持,是我们没有让它“支持”。
手动让它支持一下就可以了:
vc6.0 && devcpp4.9.9.0下通过。
#include <stdio.h>
#include<locale.h>
int main(int argc, char *argv[])
{
wchar_t cur_buff[]=L"你";
_wsetlocale(LC_ALL,L"chs"); //设置成chinese
wprintf(cur_buff);
return 0;
}
====================================================
我的试验结果是在dev c++下编译仍然出现问题。VC没试过,因为没装, converting to execution character set: Illegal byte sequence
我的困惑是,既然ANSI C是专门为了解决多字节字符的问题专门引入了wchar_t类型,那么就应该使用它的标准函数就可以处理宽字节的字符了,没有必要与平台相关。请问,这个程序怎样编译才能通过
====================================================
我觉得很多人总是找编译器的问题,我安装了最新的MinGW,还是出现同样的编译问题。都试了很多个编译器了。在另外的一个论坛里面,有高人给出给出这样的程序:
int main(int argc, char *argv[])
{
wchar_t *cur_buff=(wchar_t*)"你好";//或wchar_t cur_buff=(wchar_t*)'你'
printf(cur_buff);
return 0;
}
编译可以通过,因为printf不是宽字节版的程序,会给出警告,但程序执行结果是正确的,换成wprintf()后,编译没有警告,但执行时没有输出。
有点奇怪,请问为什么?
=====================================================
#include <stdio.h>
#include <locale.h>
int main(int argc, char *argv[])
{
wchar_t cur_buff[]=L"你";
_wsetlocale(LC_ALL,L"chs"); //设置成chinese
wprintf(cur_buff);
return 0;
}
这个程序是对的.关键在于文件需要保存为utf-8编码.
windows自带的notepad另存时选择utf-8编码.
====================================================
据unicode 3.0标准来看,unicode已经不直接表示一种编码方式(encoding).
而是一种字符集(character set),它有四种通用编码方式.utf-8是其中之一.
以前所说的unicode,包括windows内核使用的那种编码,现在改称为utf-16
并做了一些变化.