返回顶部

收藏

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

发表评论