zoukankan      html  css  js  c++  java
  • ASCII与Unicode编码消息写文件浅析

    【文章摘要

            ASCII与Unicode是两种常见的字符编码。

    它们的表示方法不一样,因而在程序中就要差别处理。

           本文基于作者的实际开发经验,对ASCII与Unicode两种字符编码消息的写文件过程进行了具体的分析,为相关软件开发工作的开展提供了故意的參考。

    【关键词

           ASCII  Unicode  C语言  编码  开发

     

    一、ASCII与Unicode编码简单介绍

    1. ASCII编码简单介绍

             ASCII是一套基于拉丁字母的电脑编码系统。它使用指定的7位或8位二进制数的组合来表示128或256 种可能的字符。

            标准ASCII码使用7位二进制数来表示全部的大小写字母、数字0到9、标点符号。 以及在美式英语中使用的特殊控制字符。

     

    2. Unicode编码简单介绍

             Unicode码是一种国际标准编码,採用二个字节编码,与ASCII码不兼容。眼下普遍採用的是UCS-2。

             Unicode编码从0到127的字符与ASCII编码的字符一样,比方字母“a”的Unicode编码是0x0061。十进制是97;而“a”的ASCII编码是0x61,十进制也是97。

     

    二、对ASCII与Unicode编码消息写文件的处理

    1. 需求描写叙述

            在某版本号的需求中。要求某模块将还有一模块发过来的短信消息写到文件里,该消息的编码格式为ASCII或Unicode。

     

    2. 对两种编码消息写文件的处理

    (1) ASCII编码消息的处理

             对于ASCII编码的消息,可直接将消息内容写入文件里,不用做不论什么额外的处理。

     

    (2) Unicode编码消息的处理

            对于Unicode编码的消息,须要在要写入的文件头部加入“FFFE”(小端模式)或“FEFF”(大端模式),然后将消息内容拼接到后面。

    大、小端模式要和发端模块约定好。在本模块的配置文件里控制当时发送的消息是小端模式还是大端模式。

            大端模式。是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中;小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。

     

    三、C程序实现

            基于第二部分的需求和分析,程序框架例如以下所看到的:

    ……

    char  szFileContent[1024]  = {0};

    char  szFileName[1024]   = {0};

    int     iFileSize                  = 0;

    unsigned char a               = 0xFF;

    unsigned char b               = 0xFE;

    int                     fd            =  0;                // 文件句柄

     

    if (iMsgFmt == 1)     // Unicode编码格式

    {

        if (gConfig.iUseBigEndianOrLittleEndian == 0)      // 小端模式FFFE

        {

            szFileContent[0] = a;

            szFileContent[1] = b;

        }

        else if(gConfig.iUseBigEndianOrLittleEndian == 1)    // 大端模式FEFF

        {

            szFileContent[0] = b;

            szFileContent[1] = a;

        }

        // 将消息内容szMsgContent复制到szFileContent中。注意要+2

        memcpy(szFileContent+2, szMsgContent, iMsgLength);

    }

    else     // ASCII编码格式

    {

        memcpy(szFileContent, szMsgContent, iMsgLength);   // 直接拷贝

    }

     

    // 将内容写到文件里

    if ((fd = open(szFileName, O_RDWR | O_CREAT, S_IRWXU |S_IRWXG| S_IRWXO )) <= 0)

    {

        WRITELOGEX(LOG_ERROR, ("exec open failed. FileName=%s", szFileName));

        return ERR_GENERAL;

    }

    // 保存内容

    lseek(fd, 0, SEEK_SET);

     

    if (iMsgFmt == 1)    // Unicode编码格式

    {

        // 由于在文件头部新添加了两个字节,因此要在原长度基础上加2

        iFileSize = iMsgLength+2;

     

        if (write(fd, szFileContent, iFileSize) != iFileSize)  // 写文件

        {

            WRITELOGEX(LOG_ERROR, ("exec write failed. FileName=%s", szFileName));

            close(fd);

            fd = 0;

            return ERR_GENERAL;

        }

    }

    else      // ASCII编码格式

    {

        iFileSize = iMsgLength;    // 长度不变

     

        if (write(fd, szFileContent, iFileSize) != iFileSize)        // 写文件

        {

            WRITELOGEX(LOG_ERROR, ("exec write failed. FileName=%s",szFileName));

            close(fd);

            fd = 0;

            return ERR_GENERAL;

        }

    }

     

    // 写文件成功

    WRITELOGEX(LOG_INFO, ("exec write successfully. FileName=%s",szFileName));

    close(fd);

    fd = 0;

     

    四、总结

           本文对ASCII与Unicode两种字符编码进行了简单的分析。并用C语言代码演示了两种编码消息的整个写文件的过程。由于字符编码格式的多样性。所以我们要依据每种编码的特点来进行写文件的操作。本文为相关软件项目依据不同编码格式写文件的开发工作的开展提供了故意的參考。



    (本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426。欢迎关注!

    )

  • 相关阅读:
    Configure JSON.NET to ignore DataContract/DataMember attributes
    Visual Studio 独立 Shell 下载
    Xamarin.Forms 自定义 TapGestureRecognizer 附加属性
    Xamarin 自定义 ToolbarItem 溢出菜单实现(Popover/Popup) 弹出下拉效果
    xamarin.forms 动态条件更换数据模板
    Xamarin.Forms FlexLayout 布局扩展+ 模板扩展+弹性换行
    Xamarin.Forms 开发资源集合
    Xamarin Forms Api请求开源框架Refit
    Xamarin Forms error MSB6006: “java.exe”已退出,代码为 2 解决办法
    Xamarin.Forms 未能找到路径“x:platforms”的一部分
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5073116.html
Copyright © 2011-2022 走看看