// $Id: ucs2_utf8.cpp,v 1.5 2002/07/01 00:09:54 hio Exp $ #include "Japanese.h" /* * ucs2=>utf8文字列変換 */ EXTERN_C SV* xs_ucs2_utf8(SV* sv_str) { if( sv_str==&PL_sv_undef ) { return newSVpvn("",0); } STRLEN PL_na; unsigned char* src = (unsigned char*)SvPV(sv_str,PL_na); const int len = sv_len(sv_str); //fprintf(stderr,"Unicode::Japanese::(xs)ucs2_utf8\n",len); //bin_dump("in ",src,len); SV_Buf result(len*3/2+4); if( len&1 ) { Perl_croak(aTHX_ "Unicode::Japanese::ucs2_utf8, invalid length (not 2*n)"); } const unsigned char* src_end = src+(len&~1); unsigned char buf[4]; for(; src> 6); buf[1] = 0x80 | (ucs2 & 0x3F); result.append(buf,2); }else { buf[0] = 0xE0 | (ucs2 >> 12); buf[1] = 0x80 | ((ucs2 >> 6) & 0x3F); buf[2] = 0x80 | (ucs2 & 0x3F); result.append(buf,3); } } //bin_dump("out",result.getBegin(),result.getLength()); result.setLength(); return result.getSv(); } /* * utf8=>ucs2文字列変換 */ EXTERN_C SV* xs_utf8_ucs2(SV* sv_str) { if( sv_str==&PL_sv_undef ) { return newSVpvn("",0); } STRLEN PL_na; unsigned char* src = (unsigned char*)SvPV(sv_str,PL_na); const int len = sv_len(sv_str); //fprintf(stderr,"Unicode::Japanese::(xs)utf8_ucs2\n",len); //bin_dump("in ",src,len); SV_Buf result(len); const unsigned char* src_end = src+len; while( src=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf=src_end || src[1]<0x80 || 0xbf