c中汉字的输出问题

jintang163 2011-02-21 03:33:03
在c语言中,如何将一个汉字转换成一个整型数字,
和一个整字再转换成为一个汉字。
如“沪”对应的数字为27818,将27818通过一定的方法再转换为汉字“沪”
这个如何实现,请高手指教!谢谢
我是这样弄的
char c = '沪';
printf("%c",c);
printf("%d",(int)c);
打印出来的字符为乱码,请高手给出具体的代码!
...全文
210 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-02-22
  • 打赏
  • 举报
回复
Unicode转GBK用API WideCharToMultiByte
pjl1119 2011-02-22
  • 打赏
  • 举报
回复
楼上学识渊博,旷古绝今,小弟对你的崇拜之情如黄河之水一发而不可收!
赵4老师 2011-02-22
  • 打赏
  • 举报
回复
沪 GBK为 0xBBA6 ;Unicode为 0x6CAA 即27818
GBK转Unicode用API MultiByteToWideChar
AnYidan 2011-02-22
  • 打赏
  • 举报
回复
好象陈龙的c#视频中有一两集专门讲字符集,楼主可以看看,但汉字肯定是2bytes,你的程序中赋值是只保留了地字节,很有可能是乱码
wizard_tiger 2011-02-22
  • 打赏
  • 举报
回复
一个汉字占两个字节,应该用一个字符数组,或用一个字符型指针。
無_1024 2011-02-22
  • 打赏
  • 举报
回复
一个汉字两个字节啊 用数组表示
jackiesen 2011-02-22
  • 打赏
  • 举报
回复
http://blog.csdn.net/jackiesen/archive/2010/05/18/5604424.aspx。可以看下我的博客,希望对你有帮助!
pathuang68 2011-02-22
  • 打赏
  • 举报
回复
用iconv吧,和平台无关。请看用ICONV解决字符集转换问题,里面有现成的代码。
jintang163 2011-02-22
  • 打赏
  • 举报
回复
好,多谢各位!..........
赵4老师 2011-02-22
  • 打赏
  • 举报
回复
[code=C]#include <stdio.h>
#include <windows.h>
void main() {
char hz[3]="沪";
unsigned short uc;

MultiByteToWideChar(1,1,hz,2,&uc,1);
printf("%d\n",uc);
WideCharToMultiByte(1,512,&uc,1,hz,2,0,0);
printf("%s\n",hz);
}
[/code]
wangchensong 2011-02-21
  • 打赏
  • 举报
回复
char 是一个字节,汉字 是两个字节
jianguzi 2011-02-21
  • 打赏
  • 举报
回复
ddddddddddddddddddddddddddddd
breakerzy 2011-02-21
  • 打赏
  • 举报
回复
为什么我说 console 子系统是转成 GBK 了呢,你将这个程序手工运行结果重定向到文件看看:a.exe > res.txt,res.txt 就是 GBK 编码的。

哪里指定是 GBK 了?setlocale(LC_ALL, "") 中的 "" 就表示 GBK,因为在它表示系统的当前用户设置编码,Windows 中文版默认的就是 GBK,而 Linux 可以用 locale 命令查看当前用户默认字符集。

为什么在 Windows 下输出 UCS2 编码就显示乱码,用 setlocale() 转成 GBK 就好了?因为 Windows 控制台自己使用的字符集是 GBK,打开 cmd.exe 看看它的属性里有 GBK 又叫 CP936(微软的叫法)。你可以把它设置成UCS编码,用 chcp 命令,然后选另一个字体(默认的系统字体不行),然后再运行上面程序,去掉 setlocale() 那行,也可以正常显示出你想要的汉字。
breakerzy 2011-02-21
  • 打赏
  • 举报
回复
初学者一定要理解什么是【字面量】和【字符集】。如果在源程序中给个整形 (char/int/long),它是某个字符的编码(把它赋值给 字符类型),那么这是没什么歧义的,因为对机器来说它才不过是什么 字,它只认得内存中的字节,整形给定字节就填上了。

但反过来就不是了,一旦你把一个用引号括起来的东东传给一个整形,我天,编译器怎知到传过去后,"中" 在内存中是填上表示 (1) GBK 编码的 D0 D6,(2) 还是应该填上 UCS2 的 4E 2D,(3) 还是填上 UTF-8 的 E4 B8 AD,还是填上 (4) BIG5 的...,太多的可能性了。所以 C/C++ 标准和各种编译器都有些约定,比如对于 VC 来说字面量带 L 前缀表示按第 (2) 种方法填内存(Linux GCC 带 L 前缀就却不是这么填)。

但一般来说各种汉字的编码都不会超过 4 个字节。贼偏僻的汉字用 GB18030 或 UCS4 都可能占 4 个字节。

你那个 27818 (6CAA) 我看了,是 UCS2 字符集的 "沪" 字,在其它字符集就不是这个字了,即你所谓的乱码。

试试这个

int a = 27818;
wprintf(L"this is: %c\n", a);

当然还会错。因为,还在输出时还要和 windows console 子系统之间进行协商,告示它,让其转换成 GBK 编码后再输出。

在这个之前加入

setlocale(LC_ALL, "");

试试。
可乐崽 2011-02-21
  • 打赏
  • 举报
回复
char *hp = "沪";
printf("%c%c = %d + %d", hp[0], hp[1], hp[0], hp[1]);
justkk 2011-02-21
  • 打赏
  • 举报
回复
参考http://wenwen.soso.com/z/q220009327.htm
t871215x 2011-02-21
  • 打赏
  • 举报
回复
找汉字库吧,没弄个!关注下
maoxing63570 2011-02-21
  • 打赏
  • 举报
回复
莫非楼主不知道一个汉字要占两个字节

69,369

社区成员

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

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