1 #include "../../include/unicode/utfconversion.h"
\r
4 #include "../../include/pstdint.h"
\r
7 namespace UTFConversion
\r
10 const bool FromUTF8(const std::vector<std::string::value_type> &utf8string, std::wstring &wcstring)
\r
12 if(utf8string.size()==0)
\r
14 wcstring.assign(L"");
\r
18 std::vector<std::wstring::value_type> dest(utf8string.size(),0); // dest will never be bigger than the input but could be smaller
\r
20 const UTF8 *sourcestart=reinterpret_cast<const UTF8 *>(&utf8string[0]);
\r
21 const UTF8 *sourceend=sourcestart+utf8string.size();
\r
23 if(sizeof(std::wstring::value_type)==2 && sizeof(UTF16)==2)
\r
25 UTF16 *deststart=reinterpret_cast<UTF16 *>(&dest[0]);
\r
26 UTF16 *destend=deststart+dest.size();
\r
28 ConversionResult rval=ConvertUTF8toUTF16(&sourcestart,sourceend,&deststart,destend,lenientConversion);
\r
30 if(rval!=conversionOK)
\r
35 wcstring.assign(dest.begin(),dest.end()-(destend-deststart));
\r
38 else if(sizeof(std::wstring::value_type)==4 && sizeof(UTF32)==4)
\r
40 UTF32 *deststart=reinterpret_cast<UTF32 *>(&dest[0]);
\r
41 UTF32 *destend=deststart+dest.size();
\r
43 ConversionResult rval=ConvertUTF8toUTF32(&sourcestart,sourceend,&deststart,destend,lenientConversion);
\r
45 if(rval!=conversionOK)
\r
50 wcstring.assign(dest.begin(),dest.end()-(destend-deststart));
\r
55 std::vector<uint32_t> dest2(utf8string.size(),0);
\r
56 UTF32 *deststart=reinterpret_cast<UTF32 *>(&dest2[0]);
\r
57 UTF32 *destend=deststart+dest2.size();
\r
59 ConversionResult rval=ConvertUTF8toUTF32(&sourcestart,sourceend,&deststart,destend,lenientConversion);
\r
61 if(rval!=conversionOK)
\r
66 wcstring.assign(dest2.begin(),dest2.end()-(destend-deststart));
\r
73 const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring)
\r
76 if(utf8string.size()>0)
\r
78 return FromUTF8(std::vector<std::string::value_type>(utf8string.begin(),utf8string.end()),wcstring);
\r
82 wcstring.assign(L"");
\r
88 const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)
\r
90 if(wcstring.size()==0)
\r
92 utf8string.assign("");
\r
96 std::vector<std::wstring::value_type> source(wcstring.begin(),wcstring.end());
\r
98 if(sizeof(std::wstring::value_type)==2 && sizeof(UTF16)==2)
\r
100 std::vector<std::string::value_type> dest(wcstring.size()*2,0);
\r
102 const UTF16 *sourcestart=reinterpret_cast<const UTF16 *>(&source[0]);
\r
103 const UTF16 *sourceend=sourcestart+source.size();
\r
105 UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);
\r
106 UTF8 *destend=deststart+dest.size();
\r
108 ConversionResult rval=ConvertUTF16toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);
\r
110 if(rval!=conversionOK)
\r
115 utf8string.assign(dest.begin(),dest.end()-(destend-deststart));
\r
118 else if(sizeof(std::wstring::value_type)==4 && sizeof(UTF32)==4)
\r
120 std::vector<std::string::value_type> dest(wcstring.size()*4,0);
\r
122 const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source[0]);
\r
123 const UTF32 *sourceend=sourcestart+source.size();
\r
125 UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);
\r
126 UTF8 *destend=deststart+dest.size();
\r
128 ConversionResult rval=ConvertUTF32toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);
\r
130 if(rval!=conversionOK)
\r
135 utf8string.assign(dest.begin(),dest.end()-(destend-deststart));
\r
140 std::vector<uint32_t> source2(wcstring.begin(),wcstring.end());
\r
141 std::vector<std::string::value_type> dest(wcstring.size()*sizeof(std::wstring::value_type),0);
\r
143 const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source2[0]);
\r
144 const UTF32 *sourceend=sourcestart+source2.size();
\r
146 UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);
\r
147 UTF8 *destend=deststart+dest.size();
\r
149 ConversionResult rval=ConvertUTF32toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);
\r
151 if(rval!=conversionOK)
\r
156 utf8string.assign(dest.begin(),dest.end()-(destend-deststart));
\r