zoukankan      html  css  js  c++  java
  • 用C语言实现中文到unicode码的转换

    转自:  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: ");
      for (i = 0; i < wcslen(chinese_str); i++)
      {
      printf("0x%x ", p[i]);

      }

     printf(" ");

        return 0 ;

    }


    编译: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 ",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' ",cnt,cnt,cnt);
    }
    if(strcmp(argv[1],"a")==0)
    {
      printf ("Insert your char: ");
     scanf("%c",&str);
     printf ("Your Ascail is: %d  0x%x  '%c' ",str,str,str);
    }
     return 0;
    }
    编译:  gcc main.c -o main      

  • 相关阅读:
    Windows Server 2008 下解析二级域名的方法
    浅谈2D游戏设计模式--游戏剧情设计(1)
    公司做项目的几点经验总结(个人经验)
    ASP.NET 实现站内信功能(点对点发送,管理员群发)
    FusionChart 水印破解方法(代码版)
    如何使用SOIL在VS2012的 C++环境下显示图片
    C语言实现控制台中光标随意移动
    ASP.NET CMS模板培训教程
    如何用easyui+JAVA 实现动态拼凑datagrid表格(续)
    用JAVA实现插值查询的方法(算近似值,区间求法)
  • 原文地址:https://www.cnblogs.com/alan666/p/8311996.html
Copyright © 2011-2022 走看看