UnicodeStringをJISやEUC-JPに変換すると「~」が文字化けします。
UnicodeString uni = L"10~20";
AnsiStringT<50220> jis = uni; //=> 「~」が文字化けする
反対に、JISやEUC-JPをUnicodeStringに変換しても「~」が文字化けします。
# ちなみにShift-JISでは文字化けしません。
(修正)Shift-JISでも問題が発生するようです。
この問題を回避する関数がMECSUtilsに用意されています。
MecsMappingFix_UnicodeToJISX0208 関数とMecsMappingFix_JISX0208ToUnicode 関数です。
# MECSUtils ver1.33から関数名が変わりました。
UnicodeStringをJISやEUC-JPに変換するときは、MecsMappingFix_UnicodeToJISX0208 関数を使用してから、変換します。
#include "MECSUtils.hpp"
UnicodeString uni = L"10~20";
uni = Mecsutils::MecsMappingFix_UnicodeToJISX0208(uni);
AnsiStringT<50220> jis = uni; //=>「10~20」
UnicodeStringをShift-JISに変換するときは、MecsMappingFix_UnicodeToCP932 関数を使います。
#include "MECSUtils.hpp"
UnicodeString uni = …
uni = Mecsutils::MecsMappingFix_UnicodeToCP932(uni);
AnsiStringT<932> sjis = uni;
反対に、JISやEUC-JPをUnicodeStringに変換するときは、UnicodeStringに変換してから、MecsMappingFix_JISX0208ToUnicode関数を使用します。
#include "MECSUtils.hpp"
UnicodeString uni = Mecsutils::AnsiToUTF16(raw, CodePage);
uni = Mecsutils::MecsMappingFix_JISX0208ToUnicode(uni);
Shift-JISをUnicodeStringに変換するときは、MecsMappingFix_CP932ToUnicode 関数を使います。
#include "MECSUtils.hpp"
UnicodeString uni = Mecsutils::AnsiToUTF16(raw, CodePage);
uni = Mecsutils::MecsMappingFix_CP932ToUnicode(uni);
各関数についての詳細は、MECSUtils リファレンスに丁寧な説明がありますので、そちらをご覧下さい。
- MecsMappingFix_CP932ToUnicode
- MecsMappingFix_JISX0208ToUnicode
- MecsMappingFix_UnicodeToCP932
- MecsMappingFix_UnicodeToJISX0208
追記
MECSUtils 1.35でCP932(Shift-JIS)用の関数も用意されました。
Shift-JISに関する記述を修正しました。
「DEKOのざつだん。」によると、私が思っていたよりも複雑な問題だったようです。
DEKOさんの丁寧な対応に感謝します。
Pingback: C++Builder 2010のIndyでメール送信について « 山本隆の開発日誌
Pingback: 文字コードがJISやEUC-JPの文字列をUnicodeStringに変換したときの波ダッシュ問題 « 山本隆の開発日誌
Pingback: UnicodeStringからJISコードへの変換時に起こる波ダッシュ問題の回避策 « 山本隆の開発日誌