ANSI C的宽字节和汉字编码

以前没用过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
并做了一些变化.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值