设为首页 加入收藏

TOP

C++中各种string的相互转化(四)
2013-10-17 09:03:49 来源: 作者: 【 】 浏览:596
Tags:各种 string 相互 转化

 

  * The cases all fall through. See "Note A" below.

  */

  switch (extraBytesToRead) {

  case 5: ch += *source++; ch 《= 6;

  case 4: ch += *source++; ch 《= 6;

  case 3: ch += *source++; ch 《= 6;

  case 2: ch += *source++; ch 《= 6;

  case 1: ch += *source++; ch 《= 6;

  case 0: ch += *source++;

  }

  ch -= offsetsFromUTF8[extraBytesToRead];

  if (target >= targetEnd) {

  source -= (extraBytesToRead+1); /* Back up the source pointer! */

  result = targetExhausted; break;

  }

  if (ch <= UNI_MAX_LEGAL_UTF32) {

  /*

  * UTF-16 surrogate values are illegal in UTF-32, and anything

  * over Plane 17 (> 0x10FFFF) is illegal.

  */

  if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {

  if (flags == strictConversion) {

  source -= (extraBytesToRead+1); /* return to the illegal value itself */

  result = sourceIllegal;

  break;

  } else {

  *target++ = UNI_REPLACEMENT_CHAR;

  }

  } else {

  *target++ = ch;

  }

  } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */

  result = sourceIllegal;

  *target++ = UNI_REPLACEMENT_CHAR;

  }

  }

  *sourceStart = source;

  *targetStart = target;

  return result;

  }

  /* ---------------------------------------------------------------------

  Note A.

  The fall-through switches in UTF-8 reading code save a

  temp variable, some decrements & conditionals.  The switches

  are equivalent to the following loop:

  {

  int tmpBytesToRead = extraBytesToRead+1;

  do {

  ch += *source++;

  --tmpBytesToRead;

  if (tmpBytesToRead) ch 《= 6;

  } while (tmpBytesToRead > 0);

  }

  In UTF-8 writing code, the switches on "bytesToWrite" are

  similarly unrolled loops.

  --------------------------------------------------------------------- */

  三 C++ 的字符串与C#的转化

  1)将system::String 转化为C++的string:

  // convert_system_string.cpp

  // compile with: /clr

  #include <string>

  #include <iostream>

  using namespace std;

  using namespace System;

  void MarshalString ( String ^ s, string& os ) {

  using namespace Runtime::InteropServices;

  const char* chars =

  (const char*)(Marshal::StringToHGlobalAnsi(s))。ToPointer();

  os = chars;

  Marshal::FreeHGlobal(IntPtr((void*)chars));

  }

  void MarshalString ( String ^ s, wstring& os ) {

  using namespace Runtime::InteropServices;

  const wchar_t* chars =

  (const wchar_t*)(Marshal::StringToHGlobalUni(s))。ToPointer();

  os = chars;

  Marshal::FreeHGlobal(IntPtr((void*)chars));

  }

  int main() {

  string a = "test";

  wstring b = L"test2";

  String ^ c = gcnew String("abcd");

  cout 《 a 《 endl;

  MarshalString(c, a);

  c = "efgh";

  MarshalString(c, b);

  cout 《 a 《 endl;

  wcout 《 b 《 endl;

  }

  2)将System::String转化为char*或w_char*

  // convert_string_to_wchar.cpp

  // compile with: /clr

  #include < stdio.h >

  #include < stdlib.h >

  #include < vcclr.h >

  using namespace System;

  int main() {

  String ^str = "Hello";

  // Pin memory so GC can't move it while native function is called

  pin_ptr<const wchar_t> wch = PtrToStringChars(str);

  printf_s("%S\n", wch);

  // Conversion to char* :

  // Can just convert wchar_t* to char* using one of the

  // conversion functions such as:

  // WideCharToMultiByte()

  // wcstombs_s()

  //  etc

  size_t convertedChars = 0;

  size_t  sizeInBytes = ((str->Length + 1) * 2);

  errno_t err = 0;

  char    *ch = (char *)malloc(sizeInBytes);

  err = wcstombs_s(&convertedChars,

  ch, sizeInBytes,

  wch, sizeInBytes);

  if (err != 0)

  printf_s("wcstombs_s  failed!\n");

  printf_s("%s\n", ch);

  }

          

首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++接口与实现分离的2种方法 下一篇转盘旋转算法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: