UnicodeStringの波ダッシュ問題の回避策のまとめ

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 リファレンスに丁寧な説明がありますので、そちらをご覧下さい。

追記
MECSUtils 1.35でCP932(Shift-JIS)用の関数も用意されました。
Shift-JISに関する記述を修正しました。

DEKOのざつだん。」によると、私が思っていたよりも複雑な問題だったようです。
DEKOさんの丁寧な対応に感謝します。

コメント

  1. Pingback: C++Builder 2010のIndyでメール送信について « 山本隆の開発日誌

  2. Pingback: 文字コードがJISやEUC-JPの文字列をUnicodeStringに変換したときの波ダッシュ問題 « 山本隆の開発日誌

  3. Pingback: UnicodeStringからJISコードへの変換時に起こる波ダッシュ問題の回避策 « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください