ANSI C的宽字节和汉字编码
2007-06-04 19:48
225 查看
以前没用过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
并做了一些变化.
#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
并做了一些变化.
相关文章推荐
- python中文utf8编码后是占3个字符,unicode汉字为2字节
- 汉字UTF8编码占用几个字节
- mysql 编码和汉字存储占用字节问题的探索
- 英文字母和中文汉字在不同字符集编码下的字节数
- utf8编码的字符(如汉字 占三个字节)用啥字符数据类型储存 C++
- 汉字与多字节编码的转换 - 回复 "不知道" 的问题
- mysql 编码和汉字存储占用字节问题的探索
- 关于在web编程中汉字采用unicode的6字节明文编码(json汉字处理)
- utf8编码-汉字几字节
- JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题
- 不同编码集汉字所占字节
- javascript取得汉字的字节编码
- Oracle 一个中文汉字 占用几个字节,由Oracle中字符集编码决定
- UTF-8 编码里,一个汉字占用多少个字节 -转
- php中按字节截取字符串方法,(汉字占两个字节,字母占一个字节,页面编码必须为utf-8)
- 1个汉字在UTF-8编码占3个字节
- Oracle 一个中文汉字 占用几个字节,由Oracle中字符集编码决定
- python中文utf8编码后是占3个字符,unicode汉字为2字节
- 对GBK的理解(内附全部字符编码列表):扩充的2万汉字低字节的高位不等于1,而且还剩许多编码空间没有利用
- JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题