Summer Memories

 
本当に欲しいモノは なかなか気づいてもらえない
海の音 風の音 波の音 満天の星に祈りを
つながってほしい時にかぎって きまってつながらないものだね
だから今もこうしてキミだけを待っているんだね
Summer Memories
夢を追うその背中を ずっと追い掛け続けたいから
未来なんて遠くて見えないけど一人の夜は長すぎる一分(ジカン) 見上げた空 輝いて
Summer Memories
悲しみ嘘にして笑うことより 人は幸せの箱 探して見つける 旅人
どんなに大人ぶっても ココロの中は弱いんだよ キミなしではきっと…
Summer Memories
恐がって目を伏せてた 臆病さが道をふさいだ
だから今はこうして一人きりで歩いてみたんだけど
Summer Memories
大きな空をはばたく君はキレイで こんな日が来ること知っていたはずなのに
不思議だね 小さな想い出たちが一つになってココロの中 忘れることもできずに
Summer Memories
記憶の中を生きることより 人は明日へのトビラを探して見つける旅人
どんなに離れたとしてもいつでも私はここにいるよ
戻らないとしても…
Summer Memories
夢を追うその背中を ずっと追い掛け続けたいから
未来なんて遠くて見えないけど一人の夜は長すぎる一分(ジカン) 見上げた空輝いて
Summer Memories
悲しみ嘘にして笑うことより 人は幸せの箱 探して見つける 旅人
どんなに大人ぶっても ココロの中は弱いんだよ キミなしではきっと..
Summer Memories
Summer Memories

UTF8 to UCS4, and UCS4 to UTF8

iconv series functions (iconv_open/iconv/iconv_close) are native support of charset encoding conversion on ***nix based OS. Poor documentation, and less sample code on the use of them.  Even though there was a version that can be found online, it might not work on Mac. Here is my version…
 

#include <iostream>

 

#include <iconv.h>

#include <stdlib.h>

 

#define _MAC_OS_X

 

 

#ifdef _MAC_OS_X

namespace

{

          class iconv_wrapper

          {

          public:

                   iconv_wrapper( const char *tocode, const char *fromcode )

                   {

                             __cd = iconv_open( tocode, fromcode );

                   }

                   ~iconv_wrapper()

                   {

                             iconv_close( __cd );

                   }

                   size_t __iconv ( char **inbuf,  size_t *inbytesleft,

                             char **outbuf, size_t *outbytesleft )

                   {

                             if ( (iconv_t)-1 == __cd )

                                      return -1;

 

                             return iconv( __cd, inbuf, inbytesleft, outbuf, outbytesleft );

                   }

          private:

                   iconv_t __cd;

          };

 

          static size_t __wcstoutf8( const wchar_t *in, size_t in_len,

                   char *out, size_t out_len )

          {

                   iconv_wrapper conv ( "UTF8", "UCS-4-INTERNAL" );

                   char *pin = (char *)in;

                   size_t in_len_in_byte = wcslen( in ) * sizeof( wchar_t );

                   return conv.__iconv( &pin, &in_len_in_byte, &out, &out_len );             

          }

 

          static size_t __wcstoutf8( const std::wstring &in, std::string &out )

          {

                   const wchar_t *pin = in.c_str();

                   size_t in_len = in.length() + 1;

 

                   // UTF8 at most will be 6 bytes at length.

                   size_t out_max = in_len * 6;

 

                   std::auto_ptr<char> buffer( new char[out_max] );

                   memset( buffer.get(), 0, out_max );

 

                   size_t ret = __wcstoutf8 ( pin, in_len * sizeof( wchar_t ), buffer.get(), out_max );

 

                   if ( -1 != ret ) {

                             out = buffer.get();

                   }

 

                   return ret;

          }

 

          static size_t __utf8towcs( const char *in, size_t in_len,

                   wchar_t *out, size_t out_len )

          {

                   iconv_wrapper conv ( "UCS-4-INTERNAL", "UTF8" );

                   char *pout = (char *)out;

                   return conv.__iconv( (char**)&in, &in_len, &pout, &out_len );

          }

 

          static size_t __utf8towcs( const std::string &in, std::wstring &out )

          {

                   const char *pin = in.c_str();

                   size_t in_len = in.length() + 1;

 

                   // A char in UTF8 may be in ASCII range.

                   size_t out_max = in_len * 4;

 

                   std::auto_ptr<char> buffer( new char[out_max] );

                   memset( buffer.get(), 0, out_max );

 

                   size_t ret = __utf8towcs ( pin, in_len, (wchar_t*)buffer.get(), out_max );

 

                   if ( -1 != ret ) {

                             out = (wchar_t*)buffer.get();

                   }

 

                   return ret;

          }

}

#endif

 

int main (int argc, char * const argv[]) {

 

          std::wstring in = L"china ";

          std::string out;

 

          // Demo1: unicode (4 bytes on Mac, Unix, Linux) to UTF8

          __wcstoutf8( in, out );

          std::cout << "UTF8:" << out << std::endl;

 

          // Demo1: UTF8 to unicode (4 bytes on Mac, Unix, Linux).

          __utf8towcs( out, in );

          std::wcout << L"UCS-4-INTERNAL:" << in << std::endl;

 

          return 0;

}

 
Austin.D