返回顶部

收藏

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. 博主 发表 2016-06-28 05:17:59 Bazel C++ 基础[翻译]
  2. 博主 发表 2011-11-03 16:00:00 C++ 语言基础
  3. thinkpc 发表 2016-03-04 13:55:30 c++ 11 map基础value排序
  4. pansunyou 发表 2014-11-30 02:51:00 C++通用跨数据库访问方案之一: 基础组件cdbc
  5. linux@linux.cn (linu 发表 2016-11-04 02:37:00 C++ 程序员 Protocol Buffers 基础指南
  6. tanglei 发表 2014-05-28 15:08:01 struct与class区别联系
  7. ImportNew读者投稿 发表 2013-03-14 09:48:51 Java到底是传引用还是传值?
  8. Dave Abrahams 发表 2011-11-04 08:16:16 Having it all: Pythy syntax for C++
  9. Herb Sutter 发表 2012-04-30 23:19:59 C++ Libraries: Casablanca
  10. Herb Sutter 发表 2012-09-18 20:53:01 C&B 2012 panel posted: Ask Us Anything!
  11. Herb Sutter 发表 2013-01-16 00:20:29 Videos: Panel, and C++ Concurrency
  12. Eric Battalio 发表 2013-03-11 18:34:00 Advanced Developers Conference 2013: C++

发表评论