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。欢迎关注!

    )

  • 相关阅读:
    【arm】using as: GNU assember学习笔记
    【linux】gcc编译选项:-fomit-frame-pointer,-fno-tree-vectorize,-fno-strict-aliasing以及ARM相关选项
    【arm】armv8中通用寄存器的饱和指令实现(对标arm32:ssat,usat,qadd,qsub)
    【shell】常用的几种shell解释器:sh,bash,zsh,ash,csh
    【linux/Tools】Performance Profile Tools——perf and gprof
    【android】如何查看Android设备的CPU架构信息
    【arm】big-LITTLE architecture and How to check core, frequency, features of CPU and memory infos
    【python】创建excel文档.csv
    【mpeg4】MPEG-4 B帧帧间预测模式
    【linux】关于find命令查找的排序规则探索以及排序方法
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5073116.html
Copyright © 2011-2022 走看看