version 0.3.25
[fms.git] / src / unicode / utfconversion.cpp
1 #include "../../include/unicode/utfconversion.h"\r
2 \r
3 namespace UTFConversion\r
4 {\r
5 \r
6 const bool FromUTF8(const std::vector<char> &utf8string, std::wstring &wcstring)\r
7 {\r
8         if(utf8string.size()==0)\r
9         {\r
10                 wcstring.assign(L"");\r
11                 return true;\r
12         }\r
13 \r
14         std::vector<wchar_t> dest(utf8string.size(),0);         // dest will never be bigger than the input but could be smaller\r
15         \r
16         const UTF8 *sourcestart=reinterpret_cast<const UTF8 *>(&utf8string[0]);\r
17         const UTF8 *sourceend=sourcestart+utf8string.size();\r
18         \r
19         if(sizeof(wchar_t)==2)\r
20         {       \r
21                 UTF16 *deststart=reinterpret_cast<UTF16 *>(&dest[0]);\r
22                 UTF16 *destend=deststart+dest.size();\r
23                 \r
24                 ConversionResult rval=ConvertUTF8toUTF16(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
25                 \r
26                 if(rval!=conversionOK)\r
27                 {\r
28                         return false;   \r
29                 }\r
30                 \r
31                 wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
32                 \r
33         }\r
34         else if(sizeof(wchar_t)==4)\r
35         {\r
36                 UTF32 *deststart=reinterpret_cast<UTF32 *>(&dest[0]);\r
37                 UTF32 *destend=deststart+dest.size();\r
38                 \r
39                 ConversionResult rval=ConvertUTF8toUTF32(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
40 \r
41                 if(rval!=conversionOK)\r
42                 {\r
43                         return false;   \r
44                 }\r
45                 \r
46                 wcstring.assign(dest.begin(),dest.end()-(destend-deststart));\r
47                 \r
48         }\r
49         else\r
50         {\r
51                 return false;   \r
52         }\r
53 \r
54         return true;\r
55 }\r
56 \r
57 const bool FromUTF8(const std::string &utf8string, std::wstring &wcstring)\r
58 {\r
59 \r
60         return FromUTF8(std::vector<char>(utf8string.begin(),utf8string.end()),wcstring);\r
61 \r
62 }\r
63 \r
64 const bool ToUTF8(const std::wstring &wcstring, std::string &utf8string)\r
65 {\r
66         if(wcstring.size()==0)\r
67         {\r
68                 utf8string.assign("");\r
69                 return true;\r
70         }\r
71 \r
72         std::vector<wchar_t> source(wcstring.begin(),wcstring.end());\r
73         \r
74         if(sizeof(wchar_t)==2)\r
75         {\r
76                 std::vector<char> dest(wcstring.size()*2,0);\r
77                 \r
78                 const UTF16 *sourcestart=reinterpret_cast<const UTF16 *>(&source[0]);\r
79                 const UTF16 *sourceend=sourcestart+source.size();\r
80                 \r
81                 UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);\r
82                 UTF8 *destend=deststart+dest.size();\r
83                 \r
84                 ConversionResult rval=ConvertUTF16toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
85                 \r
86                 if(rval!=conversionOK)\r
87                 {\r
88                         return false;   \r
89                 }\r
90                 \r
91                 utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
92                 \r
93         }\r
94         else if(sizeof(wchar_t)==4)\r
95         {\r
96                 std::vector<char> dest(wcstring.size()*4,0);\r
97                 \r
98                 const UTF32 *sourcestart=reinterpret_cast<const UTF32 *>(&source[0]);\r
99                 const UTF32 *sourceend=sourcestart+source.size();\r
100                 \r
101                 UTF8 *deststart=reinterpret_cast<UTF8 *>(&dest[0]);\r
102                 UTF8 *destend=deststart+dest.size();\r
103                 \r
104                 ConversionResult rval=ConvertUTF32toUTF8(&sourcestart,sourceend,&deststart,destend,lenientConversion);\r
105                 \r
106                 if(rval!=conversionOK)\r
107                 {\r
108                         return false;   \r
109                 }\r
110                 \r
111                 utf8string.assign(dest.begin(),dest.end()-(destend-deststart));\r
112                 \r
113         }\r
114         else\r
115         {\r
116                 return false;\r
117         }\r
118 \r
119         return true;\r
120 }\r
121 \r
122 }       // namespace\r