C++多字节字符转换为宽字符的两种方法

简介: 目前知道有两种方式:可以提供宽字符与ANSI字符之间的转换,   第一种由COM库提供的函数   char*  _com_util::ConvertBSTRToString(BSTR );   BSTR _com_util::ConvertStringToBSTR(char*);   Example   // ConvertBSTRToString.

 

目前知道有两种方式:可以提供宽字符与ANSI字符之间的转换,

  第一种由COM库提供的函数

  char*  _com_util::ConvertBSTRToString(BSTR );

  BSTR _com_util::ConvertStringToBSTR(char*);

  Example

  // ConvertBSTRToString.cpp

  #include <comutil.h>

  #include <stdio.h>

  #pragma comment(lib, "comsupp.lib")

  int main()

  {

  BSTR bstrText = ::SysAllocString(L"Test");

  wprintf(L"BSTR text: %s\n", bstrText);

  char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);

  printf("char * text: %s\n", lpszText2);

  SysFreeString(bstrText);

  delete[] lpszText2;

  }

  Output

  BSTR text: Test

  char * text: Test

  第二种标准库提供的函数

  将宽字符串wcstr转换为ANSI字符串mbstr

  size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );

  mbstr

  多字节字符的地址

  wcstr

  宽字符的地址

  count

  可以存储在多字节字符的最大字节数

  将ANSI字符串mbstr转化为宽字符串wcstr

  size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count );

  Parameters

  wcstr

  宽字符串的地址

  mbstr

  多字节字符串(ANSI)的地址

  count

  要转换的多字节的字符的个数

  Example

  /* MBSTOWCS.CPP illustrates the behavior of the mbstowcs function

  */

  #include <stdlib.h>

  #include <stdio.h>

  void main( void )

  {

  int i;

  char    *pmbnull  = NULL;

  char    *pmbhello = (char *)malloc( MB_CUR_MAX );

  wchar_t *pwchello = L"Hi";

  wchar_t *pwc      = (wchar_t *)malloc( sizeof( wchar_t ));

  printf( "Convert to multibyte string:\n" );

  i = wcstombs( pmbhello, pwchello, MB_CUR_MAX );

  printf( "\tCharacters converted: %u\n", i );

  printf( "\tHex value of first" );

  printf( " multibyte character: %#.4x\n\n", pmbhello );

  printf( "Convert back to wide-character string:\n" );

  i = mbstowcs( pwc, pmbhello, MB_CUR_MAX );

  printf( "\tCharacters converted: %u\n", i );

  printf( "\tHex value of first" );

  printf( " wide character: %#.4x\n\n", pwc );

  delete[] pmbhello;

  delete[] pwc      ;

  //该例子示例摘自msdn,我觉得这里有内存泄漏,所以我加入了

  //最后两行,应为这里涉及到动态内存分配,

  //ms-help://MS.MSDNQTR.2003FEB.2052/wcecrt/htm/_wcecrt_mbstowcs.htm

  }

  Output

  Convert to multibyte string:

  Characters converted: 1

  Hex value of first multibyte character: 0x0e1a

  Convert back to wide-character string:

  Characters converted: 1

  Hex value of first wide character: 0x0e1e

  用COM库的函数需要在转换完后,自己释放由COM库给字符串分配的内存,标准库提供的函数则要求自己事先非配一个缓存区用来存放,转换后的字符串.

 

目录
相关文章
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
232 9
|
算法 Linux C++
C++框架设计中实现可扩展性的方法
在软件开发中,可扩展性至关重要,尤其对于C++这样的静态类型语言。本文探讨了在C++框架设计中实现可扩展性的方法:1) 模块化设计降低耦合;2) 使用继承和接口实现功能扩展;3) 通过插件机制动态添加功能;4) 利用模板和泛型提升代码复用;5) 遵循设计原则和最佳实践;6) 应用配置和策略模式以改变运行时行为;7) 使用工厂和抽象工厂模式创建可扩展的对象;8) 实现依赖注入增强灵活性。这些策略有助于构建适应变化、易于维护的C++框架。
818 2
|
数据处理 C++
C++程序字符串流
C++程序字符串流
137 2
|
12月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
135 6
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
288 0
|
C++
C++ 避免多重定义的方法
C++ 避免多重定义的方法
123 0
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
187 0
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
130 3
|
存储 C++ 索引
C++程序字符数组:深入理解与实践
C++程序字符数组:深入理解与实践
192 2