UWPのDateTimeFormatterで躓いた、
デバッガで調べても、きちんとした日付が「2017年5月4日」と帰ってきているのに、wcsmbs_s関数でshiftjisに落とそうとすると、ヌルポが帰ってくる。
試しに、wchar_t *test =L”2017年5月4日”;というコードでwcsmbs_s関数に突っ込むと正常に変換される。
Platform::Stringでデバッガで追うのだが、デバッガで見る限りには、L”2017年5月4日”という式が見えるので徹底的に調べた、
String ^DTF_STR=DateTimeFormatter->format(DataTimeValue);
このコードだとだめで
String ^WIDE_STR=L"2017年5月4日";
だと、OKなので、
wchar_t wzC_DTF[20],wzC_WID[20]; wcscpy_s(wzC_DTF,DTF_Str->Data()); wcscpy_s(wzC_WID,WIDE_Str->Data());
みたいな感じでデバッガで調べた。それが、
左が、DTF_STRの配列、右がWID_STRの配列、ということで、「8206」というコードが混入しているのがわかる
ということで、これが原因かということで、
wcscpy_s(wzRs, DateStr->Data()); int n = 0; for (int i = 0; i < wcslen(wzRs); i++) { if (wzRs[i] != 8206) { wzRs2[n] = wzRs[i]; n++; } } wzRs2[n] = 0;
、というメンドイルーチンを組み込んで無事に事なきを得ましたです。(^^;…
ちかれたび。
8206(10進)=0x200E=LRMですか。
・全部左から右の文字なのに何でLRMが細かく挟まってくるんでしょうね。Localeに変なことが書いてあったりするのかしら。あるいは、DateTimeFormatterが状態を持ってなくて仕方なく意味上の塊ごとに方向指示を機械的に出力しているのか。
・Unicodeってコード表のそこかしこに制御コードが埋まっていて面倒ですね。
・widecharからmultibyteへの変換が制御コードをよしなにしてくれないなら、制御コードだけを取り除く関数が欲しいところですね。
Nathan さん、初めまして、
デバッガでPlatform::Stringだけをウォッチしていたので、原因を掴むのに苦労しました。
wchar_tで配列の中身を見ると、8206なので、除去すりゃいけるわ?ってな感じですが、SetLocaleとかの影響を調べるのに時間がかかりました。
原因がDateTimeFormatterとわかったのでまずは急場凌ぎですが、 連休が明ければ、Microsoftのサポートに問い合わせようか?しかし、連休中のAPIの異常は勘弁してほしいです。
連休明けに出さないといけないアプリがあるので(^^;…
アプリの内部処理は、基本wchar_tですが、ストアアプリなので、Platform::Stringからは外れられず、iOSとのコード共有の関係で、できるだけ Cで書いているので、こんな状態に遭遇します。