AM Daemon ライブラリリファレンス
Encoding.h
[詳解]
1 /// @file
2 /// @brief 文字コード変換処理を提供する静的クラス Encoding のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_ENCODING_H
7 #define AMDAEMON_UTIL_ENCODING_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <string>
12 #include <locale>
13 
14 namespace amdaemon
15 {
16 namespace util
17 {
18 /// @addtogroup g_util
19 /// @{
20 
21  /// @brief 文字コード変換処理を提供する静的クラス。
22  /// @see WinEncoding
23  ///
24  /// @note
25  /// - Windows環境に特化しても問題ない場合は WinEncoding クラスの利用を推奨する。
26  /// - 各メンバ関数の引数 loc を省略しているのであれば、メンバ参照におけるクラス名を
27  /// "Encoding" から "WinEncoding" に単純置換するだけで動作するようになっている。
28  ///
29  /// C++標準ライブラリを用いた文字コード変換処理を提供する。
30  ///
31  /// 静的メンバ関数 convert は、第1引数に変換種別タグ、第2引数に変換元文字列を渡すことで、
32  /// C++標準ライブラリ codecvt 等を用いて文字コード変換を行う。
33  /// マルチバイト文字列とワイド文字列との間の変換については、
34  /// 変換種別タグの指定が不要なオーバロードも定義される。
35  ///
36  /// @code
37  /// // マルチバイト文字列の "あいうえお" をUTF-8化する
38  /// std::string u8aiueo = Encoding::convert(Encoding::MbcsToUtf8, "あいうえお");
39  ///
40  /// // マルチバイト文字列の "あいうえお" をワイド文字列化する
41  /// // 変換種別タグ指定不要なオーバロード
42  /// std::wstring w_aiueo = Encoding::convert("あいうえお");
43  /// @endcode
44  ///
45  /// また、変換種別タグの指定が不要なラップ関数も用意されている。
46  ///
47  /// @code
48  /// // マルチバイト文字列の "あいうえお" をUTF-8化する
49  /// std::string u8aiueo = Encoding::convertMbcsToUtf8("あいうえお");
50  /// @endcode
51  ///
52  /// 日本語等を扱う場合、各メンバ関数を用いる前に、 std::locale::global 関数を用いて
53  /// 文字分類(std::locale::ctype)のグローバルロケールを設定しておくこと。
54  ///
55  /// 例えば main 関数の冒頭などで下記の関数呼び出しを行うとよい。
56  ///
57  /// @code
58  /// // #include <locale> が必要
59  ///
60  /// // グローバルロケールを日本語に設定する
61  /// std::locale::global(std::locale(std::locale(), "japanese", std::locale::ctype));
62  ///
63  /// // 既に作成済みの std::wcout はロケールが変更されないので
64  /// // メンバ関数 imbue を用いて個別に設定する必要がある
65  /// std::wcout.imbue(std::locale());
66  /// @endcode
67  ///
68  /// グローバルロケールを変更することが好ましくない場合、各関数の末尾の引数に
69  /// std::locale 値を渡すことで直接ロケール指定することもできる。
70  ///
71  /// @code
72  /// // #include <locale> が必要
73  ///
74  /// // 日本語ロケールでワイド文字列の L"わをん" をマルチバイト文字列化する
75  /// std::string wawon =
76  /// Encoding::convert(
77  /// L"わをん",
78  /// std::locale(std::locale(), "japanese", std::locale::ctype));
79  /// @endcode
80  ///
81  /// ロケールが影響するのはマルチバイト文字列との間の変換のみである。
82  /// ワイド文字列とUTF-8文字列との間の変換ではロケールは無視される。
83  ///
84  /// 変換できない文字が含まれている場合は変換処理を打ち切って空文字列を返す。
85  /// 主な失敗理由は次の通り。
86  ///
87  /// - テキストとして不正な文字列を変換しようとした。
88  /// - Unicodeにしかない文字(&hearts; 等)をマルチバイト文字列に変換しようとした。
89  class Encoding
90  {
91  public:
92  /// マルチバイト文字列からワイド文字列への変換を示すタグ構造体。
93  struct MbcsToWideTag { };
94  /// マルチバイト文字列からワイド文字列への変換を示すタグ。
95  static const MbcsToWideTag MbcsToWide;
96 
97  /// ワイド文字列からマルチバイト文字列への変換を示すタグ構造体。
98  struct WideToMbcsTag { };
99  /// ワイド文字列からマルチバイト文字列への変換を示すタグ。
100  static const WideToMbcsTag WideToMbcs;
101 
102  /// UTF-8文字列からワイド文字列への変換を示すタグ構造体。
103  struct Utf8ToWideTag { };
104  /// UTF-8文字列からワイド文字列への変換を示すタグ。
105  static const Utf8ToWideTag Utf8ToWide;
106 
107  /// ワイド文字列からUTF-8文字列への変換を示すタグ構造体。
108  struct WideToUtf8Tag { };
109  /// ワイド文字列からUTF-8文字列への変換を示すタグ。
110  static const WideToUtf8Tag WideToUtf8;
111 
112  /// マルチバイト文字列からUTF-8文字列への変換を示すタグ構造体。
113  struct MbcsToUtf8Tag { };
114  /// マルチバイト文字列からUTF-8文字列への変換を示すタグ。
115  static const MbcsToUtf8Tag MbcsToUtf8;
116 
117  /// UTF-8文字列からマルチバイト文字列への変換を示すタグ構造体。
118  struct Utf8ToMbcsTag { };
119  /// UTF-8文字列からマルチバイト文字列への変換を示すタグ。
120  static const Utf8ToMbcsTag Utf8ToMbcs;
121 
122  /// @brief マルチバイト文字列をワイド文字列に変換する。
123  /// @param[in] src マルチバイト文字列。
124  /// @param[in] loc ロケール設定。
125  /// @return ワイド文字列。変換できなかった場合は空文字列。
126  /// @note 変換種別タグ指定不要。
127  static std::wstring convert(
128  const std::string& src,
129  const std::locale& loc = std::locale())
130  {
131  return convert(MbcsToWide, src, loc);
132  }
133 
134  /// @brief ワイド文字列をマルチバイト文字列に変換する。
135  /// @param[in] src ワイド文字列。
136  /// @param[in] loc ロケール設定。
137  /// @return マルチバイト文字列。変換できなかった場合は空文字列。
138  /// @note 変換種別タグ指定不要。
139  static std::string convert(
140  const std::wstring& src,
141  const std::locale& loc = std::locale())
142  {
143  return convert(WideToMbcs, src, loc);
144  }
145 
146  /// @brief マルチバイト文字列をワイド文字列に変換する。
147  /// @param[in] tag 変換種別タグ。
148  /// @param[in] src マルチバイト文字列。
149  /// @param[in] loc ロケール設定。
150  /// @return ワイド文字列。変換できなかった場合は空文字列。
151  static std::wstring convert(
152  MbcsToWideTag tag,
153  const std::string& src,
154  const std::locale& loc = std::locale());
155 
156  /// @brief マルチバイト文字列をワイド文字列に変換する。
157  /// @param[in] src マルチバイト文字列。
158  /// @param[in] loc ロケール設定。
159  /// @return ワイド文字列。変換できなかった場合は空文字列。
160  static std::wstring convertMbcsToWide(
161  const std::string& src,
162  const std::locale& loc = std::locale())
163  {
164  return convert(MbcsToWide, src, loc);
165  }
166 
167  /// @brief ワイド文字列をマルチバイト文字列に変換する。
168  /// @param[in] tag 変換種別タグ。
169  /// @param[in] src ワイド文字列。
170  /// @param[in] loc ロケール設定。
171  /// @return マルチバイト文字列。変換できなかった場合は空文字列。
172  static std::string convert(
173  WideToMbcsTag tag,
174  const std::wstring& src,
175  const std::locale& loc = std::locale());
176 
177  /// @brief ワイド文字列をマルチバイト文字列に変換する。
178  /// @param[in] src ワイド文字列。
179  /// @param[in] loc ロケール設定。
180  /// @return マルチバイト文字列。変換できなかった場合は空文字列。
181  static std::string convertWideToMbcs(
182  const std::wstring& src,
183  const std::locale& loc = std::locale())
184  {
185  return convert(WideToMbcs, src, loc);
186  }
187 
188  /// @brief UTF-8文字列をワイド文字列に変換する。
189  /// @param[in] tag 変換種別タグ。
190  /// @param[in] src UTF-8文字列。
191  /// @param[in] loc ロケール設定。無視される。
192  /// @return ワイド文字列。変換できなかった場合は空文字列。
193  static std::wstring convert(
194  Utf8ToWideTag tag,
195  const std::string& src,
196  const std::locale& loc = std::locale());
197 
198  /// @brief UTF-8文字列をワイド文字列に変換する。
199  /// @param[in] src UTF-8文字列。
200  /// @param[in] loc ロケール設定。無視される。
201  /// @return ワイド文字列。変換できなかった場合は空文字列。
202  static std::wstring convertUtf8ToWide(
203  const std::string& src,
204  const std::locale& loc = std::locale())
205  {
206  return convert(Utf8ToWide, src, loc);
207  }
208 
209  /// @brief ワイド文字列をUTF-8文字列に変換する。
210  /// @param[in] tag 変換種別タグ。
211  /// @param[in] src ワイド文字列。
212  /// @param[in] loc ロケール設定。無視される。
213  /// @return UTF-8文字列。変換できなかった場合は空文字列。
214  static std::string convert(
215  WideToUtf8Tag tag,
216  const std::wstring& src,
217  const std::locale& loc = std::locale());
218 
219  /// @brief ワイド文字列をUTF-8文字列に変換する。
220  /// @param[in] src ワイド文字列。
221  /// @param[in] loc ロケール設定。無視される。
222  /// @return UTF-8文字列。変換できなかった場合は空文字列。
223  static std::string convertWideToUtf8(
224  const std::wstring& src,
225  const std::locale& loc = std::locale())
226  {
227  return convert(WideToUtf8, src, loc);
228  }
229 
230  /// @brief マルチバイト文字列をUTF-8文字列に変換する。
231  /// @param[in] tag 変換種別タグ。
232  /// @param[in] src マルチバイト文字列。
233  /// @param[in] loc ロケール設定。
234  /// @return UTF-8文字列。変換できなかった場合は空文字列。
235  static std::string convert(
236  MbcsToUtf8Tag tag,
237  const std::string& src,
238  const std::locale& loc = std::locale());
239 
240  /// @brief マルチバイト文字列をUTF-8文字列に変換する。
241  /// @param[in] src マルチバイト文字列。
242  /// @param[in] loc ロケール設定。
243  /// @return UTF-8文字列。変換できなかった場合は空文字列。
244  static std::string convertMbcsToUtf8(
245  const std::string& src,
246  const std::locale& loc = std::locale())
247  {
248  return convert(MbcsToUtf8, src, loc);
249  }
250 
251  /// @brief UTF-8文字列をマルチバイト文字列に変換する。
252  /// @param[in] tag 変換種別タグ。
253  /// @param[in] src UTF-8文字列。
254  /// @param[in] loc ロケール設定。
255  /// @return マルチバイト文字列。変換できなかった場合は空文字列。
256  static std::string convert(
257  Utf8ToMbcsTag tag,
258  const std::string& src,
259  const std::locale& loc = std::locale());
260 
261  /// @brief UTF-8文字列をマルチバイト文字列に変換する。
262  /// @param[in] src UTF-8文字列。
263  /// @param[in] loc ロケール設定。
264  /// @return マルチバイト文字列。変換できなかった場合は空文字列。
265  static std::string convertUtf8ToMbcs(
266  const std::string& src,
267  const std::locale& loc = std::locale())
268  {
269  return convert(Utf8ToMbcs, src, loc);
270  }
271 
272  private:
273  // インスタンス化禁止
274  Encoding(); // 宣言のみ
275  Encoding(Encoding&); // 宣言のみ
276  Encoding& operator=(const Encoding&); // 宣言のみ
277  };
278 
279 /// @}
280 } // namespace util
281 } // namespace amdaemon
282 
283 #endif // AMDAEMON_UTIL_ENCODING_H
static const Utf8ToWideTag Utf8ToWide
UTF-8文字列からワイド文字列への変換を示すタグ。
Definition: Encoding.h:105
static std::string convertUtf8ToMbcs(const std::string &src, const std::locale &loc=std::locale())
UTF-8文字列をマルチバイト文字列に変換する。
Definition: Encoding.h:265
ワイド文字列からマルチバイト文字列への変換を示すタグ構造体。
Definition: Encoding.h:98
static std::string convertMbcsToUtf8(const std::string &src, const std::locale &loc=std::locale())
マルチバイト文字列をUTF-8文字列に変換する。
Definition: Encoding.h:244
static const Utf8ToMbcsTag Utf8ToMbcs
UTF-8文字列からマルチバイト文字列への変換を示すタグ。
Definition: Encoding.h:120
static std::wstring convertUtf8ToWide(const std::string &src, const std::locale &loc=std::locale())
UTF-8文字列をワイド文字列に変換する。
Definition: Encoding.h:202
Daemonライブラリの環境定義を行うヘッダ。
ワイド文字列からUTF-8文字列への変換を示すタグ構造体。
Definition: Encoding.h:108
static std::string convertWideToMbcs(const std::wstring &src, const std::locale &loc=std::locale())
ワイド文字列をマルチバイト文字列に変換する。
Definition: Encoding.h:181
UTF-8文字列からマルチバイト文字列への変換を示すタグ構造体。
Definition: Encoding.h:118
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
static std::string convert(const std::wstring &src, const std::locale &loc=std::locale())
ワイド文字列をマルチバイト文字列に変換する。
Definition: Encoding.h:139
マルチバイト文字列からワイド文字列への変換を示すタグ構造体。
Definition: Encoding.h:93
UTF-8文字列からワイド文字列への変換を示すタグ構造体。
Definition: Encoding.h:103
static std::wstring convertMbcsToWide(const std::string &src, const std::locale &loc=std::locale())
マルチバイト文字列をワイド文字列に変換する。
Definition: Encoding.h:160
static std::wstring convert(const std::string &src, const std::locale &loc=std::locale())
マルチバイト文字列をワイド文字列に変換する。
Definition: Encoding.h:127
static const MbcsToUtf8Tag MbcsToUtf8
マルチバイト文字列からUTF-8文字列への変換を示すタグ。
Definition: Encoding.h:115
static std::string convertWideToUtf8(const std::wstring &src, const std::locale &loc=std::locale())
ワイド文字列をUTF-8文字列に変換する。
Definition: Encoding.h:223
static const WideToUtf8Tag WideToUtf8
ワイド文字列からUTF-8文字列への変換を示すタグ。
Definition: Encoding.h:110
static const WideToMbcsTag WideToMbcs
ワイド文字列からマルチバイト文字列への変換を示すタグ。
Definition: Encoding.h:100
static const MbcsToWideTag MbcsToWide
マルチバイト文字列からワイド文字列への変換を示すタグ。
Definition: Encoding.h:95
文字コード変換処理を提供する静的クラス。
Definition: Encoding.h:89
マルチバイト文字列からUTF-8文字列への変換を示すタグ構造体。
Definition: Encoding.h:113