c标准库函数转换“多字节”和“宽字符”字符串的问题

northcan 2012-04-21 09:49:10

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <locale.h>

int main(void)
{
wchar_t *wcs = L"大钟寺";
char buf[255] = {0};

setlocale(LC_ALL, "Chinese");
wcstombs(buf, wcs, 254);

return 0;
}


IDE用Code::Blocks时,编译器选择gcc,无法通过编译。错误指向wchar_t *wcs = L"大钟寺";这一行。
这个要怎么解决呢?

error: converting to execution character set: Illegal byte sequence|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|


用VC2008,程序可以运行,但转换结果不太正确。
比如“大”和“寺”字转换成功了。但“中”没转换成功。
...全文
317 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
clever101 2012-08-15
  • 打赏
  • 举报
回复
学习了如何在cb中设置字符集。
evencoming 2012-04-21
  • 打赏
  • 举报
回复
edit -> file encoding
northcan 2012-04-21
  • 打赏
  • 举报
回复
Code::Blocks + gcc

代码中有中文字符串的话,编译提示:Illegal byte sequence错误

这个通过如下设置解决了:settings->Compiler and debugger



northcan 2012-04-21
  • 打赏
  • 举报
回复
“2。第二个问题, setlocale(LC_ALL, "chs");”

谢谢,这个问题可以了。
qq120848369 2012-04-21
  • 打赏
  • 举报
回复
WINDOWS的前提下, 首先看CB的文件编码设置是GBK还是UTF-8的。

假设是GBK的,那么使用char数组存储中文字符串即可,打印也直接使用printf。
假设是Utf8的,那么使用char数组存储中文,并在输出前转码为gbk,之后printf打印。

因为windows默认是gbk的,所以代码首先要根据源文件的编码进行合适的转换才行。
bruceteen 2012-04-21
  • 打赏
  • 举报
回复
1。第一个问题,估计是你源文件的编码格式不对。不知道你用的是mingw哪个版本,老版本在windows下挺麻烦的,还要去掉BOM
2。第二个问题, setlocale(LC_ALL, "chs");
northcan 2012-04-21
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <locale.h>

int main(void)
{
wchar_t *wcs = L"大钟寺";
char buf[255] = {0};
wchar_t wbuf[255] = {0};

setlocale(LC_ALL, "Chinese");

wcstombs(buf, wcs, 254);
mbstowcs(wbuf, buf, 254);

return 0;
}


这段程序,先把“大钟寺”转换为“多字节”编码,然后再转回“宽字符”编码。
“中”字变成了“?”。

modyaj 2012-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]
WINDOWS的前提下, 首先看CB的文件编码设置是GBK还是UTF-8的。

假设是GBK的,那么使用char数组存储中文字符串即可,打印也直接使用printf。
假设是Utf8的,那么使用char数组存储中文,并在输出前转码为gbk,之后printf打印。

因为windows默认是gbk的,所以代码首先要根据源文件的编码进行合适的转换才行。
[/Quote]
我觉得也是

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧