转自: http://blog.csdn.net/qq_21792169/article/details/50379275
源文件用不同的编码方式编写,会导致执行结果不一样
由于本人喜欢用Notepad++编辑器,该编辑器的好处是小巧灵活,但是有几个地方做的不足,但是我都能够很好的采取相应的措施来替代,下面让我们看看Notepad++有哪些地方的不足,进而采取怎样的措施。
 
 一:Notepad++不能打开16进制文件,UE可以实现;
常用解决:我们常用的Beyond Compare 4(文本比较)可以轻松代替Notepad++不能看16进制的问题。
二Notepad++不能实现对字母,汉字转换成ascii码,uniconde码。用UE可以轻松代替。
常用解决方法:如下面代码所写的,在Linux命令下编译生成可执行文件,然后就可以运行了,就能实现你相应的功能转换,我写这个小工具是为了方便我自己用。
有些朋友就不明白了,既然UE能够那么好的实现功能,你为什么不选择用UE,所以我在这里我得说下,这看个人喜好,我喜欢Notepad++,小巧,界面直观,免费。
 
 unicode中文编码表:请点击这里!            字符编码笔记:ASCII,Unicode和UTF-8:请点击这里!
把中文转换成uniconde码:main.c
#include <stdio.h>
#include <string.h>#include <math.h>
#include <wchar.h>
int main()
{
wchar_t *chinese_str = L"网络人VS灰鸽子";
unsigned int *p = (wchar_t *)chinese_str;
int i;
printf("Uniocde: \n");
for (i = 0; i < wcslen(chinese_str); i++)
{
printf("0x%x ", p[i]);
}
  printf(" \n");
}
 
编译:gcc -finput-charset=GBK -fexec-charset=UTF-8 -o main main.c
上面的编译命令你照做就可以了,如果你不带上面的参数编译会报错,如下:
  main.c:8:24: error:   converting to execution character set: Invalid or incomplete multibyte or wide character
这是编码的问题,如果你在windos上编写代码保存的格式是GBK,gcc的编码格式默认是UTF-8。
 源文件用不同的编码方式编写,会导致执行结果不一样。
 man gcc , /charset     /*查看gcc的编码格式解析编码和运行编码*/
 -finput-charset=charset  表示源文件的编码方式, 默认以UTF-8来解析
 -fexec-charset=charset   表示可执行程序里的字时候以什么编码方式来表示,默认是UTF-8
./main
 Uniocde: 
 0x7f51 0x7edc 0x4eba 0x56 0x53 0x7070 0x9e3d 0x5b50 
!!!!上面编码可以测试。在PC机上打开一个记事本然后把程序写上去,另存为不同的格式。可以自行尝试。自行测试后更能够加深你的理解。
 
实现对字符和ascii码之间的转换(写的不是很精简)
 /* gets example */
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 void print_usage(char *file)
 {
 /* gets example */
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 void print_usage(char *file)
 {
   printf("%s c/a\n",file);
 }
 int main(int argc,char **argv)
 {
   char str;
   int  cnt;
   if(argc!=2)
 {
 print_usage(argv[0]);
 return -1;
 }
 if(strcmp(argv[1],"c")==0)
 {
    printf ("Insert your ascail: ");
    scanf("%x",&cnt);
    printf ("Your Ascail is: %d  0x%x '%c'\n",cnt,cnt,cnt);
 }
 if(strcmp(argv[1],"a")==0)
 {
   printf ("Insert your char: ");
  scanf("%c",&str);
  printf ("Your Ascail is: %d  0x%x  '%c'\n",str,str,str);
 }
  return 0;
 }
 编译:  gcc main.c -o main