返回顶部

收藏

multibyte和unicode相互转换时求长度的两个函数

更多

在实际编程中常常会遇到多字节本地码字符串和unicode字符串之间的相互转化,函数是有,但是要我们保证缓冲区的长度正确,多则浪费,少了就内存溢出,正确求长度 是关键。

比如我们要将一个多字节串转换到unicode:

const char * str = "1二3四";

该串strlen求得长度是6,如果我们就以6+1分配wchar_t空间,肯定是种浪费,因为实际上该串只有4个字符,所以,用4+1分配就足够。

因此,我们需要用到我提供的函数ansiCharsCount()。它将返回4。

int length = ansiCharsCount( str );

int size = ( length + 1 ) * sizeof( wchar_t );

size就是unicode缓冲区的字节大小。

然后我们调用Win API: MultiByteToWideChar(), 或者c库函数: mbstowcs(),把相关参数填入即可。

同样,我们要将一个unicode转换到多字节串:

const wchar_t * str = L"1二3四";

该串wcslen求得长度是4,如果我们就以(4+1)*2分配char空间,又浪费了,因为它实际上6+1个字节就能存完。

因此,需要使用unicodeMinLength()。它将返回6。

int length = unicodeMinLength( str );

int size = ( length + 1 ) * sizeof( char );

然后我们调用Win API: WideCharToMultiByte(), 或者c库函数: wcstombs(),把相关参数填入即可。

typedef bool Boolean, * PBoolean;
typedef char Char, * PChar;
typedef wchar_t WChar, * PWChar;
typedef unsigned char UChar, * PUChar, Byte, * PByte;
typedef short Short, * PShort;
typedef unsigned short UShort, * PUShort;
typedef int Int, * PInt;
typedef unsigned int UInt, * PUInt;
typedef long Long, * PLong;
typedef unsigned long ULong, * PULong;
typedef __int64 Int64, * PInt64;
typedef unsigned __int64 UInt64, * PUInt64;
typedef long long LongLong, * PLongLong;
typedef unsigned long long ULongLong, * PULongLong;
typedef double Double, * PDouble;
typedef float Float, * PFloat;
typedef Char const * PCSTR;
typedef WChar const * PCWSTR;
typedef Char * PSTR;
typedef WChar * PWSTR;

// 返回一个字符串里有多少个字符
Int ansiCharsCount( PCSTR ansiStr)
{
    Int count = 0;
    Char ch;
    while ( ch = *ansiStr )
    {
        if ( ch & (Byte)0x80 )
        {
            ansiStr++;
        }
        count++;
        ansiStr++;
    }
    return count;
}
// 返回一个unicode字符串最少长度
Int unicodeMinLength( PCWSTR unicodeStr )
{
    Int size = 0;
    WChar ch;
    while ( ch = *unicodeStr )
    {
        if ( (UShort)ch > 0xFF )
        {
            size++;
        }
        size++;
        unicodeStr++;
    }
    return size;
}
//该片段来自于http://outofmemory.cn

标签:c++,基础

收藏

0人收藏

支持

0

反对

0

»更多 您可能感兴趣的代码
  1. 2012-11-05 21:59:42java获得随机数代码 by 怪兽狂殴奥特曼
  2. 2014-11-04 13:01:18获取char*的长度 by 千万不要郁闷
  3. 2014-11-08 09:58:58打印日历 by aiheng1988
  4. 2014-12-07 12:15:24拉格朗日插值法求某一处的函数值 by qqmmcc
  5. 2012-12-18 14:03:31C++实现日期相加 by zoufei
  6. 2014-05-13 15:32:20生成不重复的随机数 by 灵剑子
  7. 2014-05-16 16:10:51通讯录管理系统 by aiheng1988
  8. 2014-05-17 16:21:16使用C++TR1实现物流配送的简单模拟 by 童学芬
  9. 2014-05-17 21:55:43计算器 by qqmmcc
  10. 2014-05-20 13:58:13基本的随机数的产生和排序 by qqmmcc
  11. 2014-05-21 14:30:44够2的程序 by 小项

发表评论