C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

RichTextBoxでファイル保存できない文字

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■93961 / inTopicNo.1)  RichTextBoxでファイル保存できない文字
  
□投稿者/ otu (1回)-(2020/02/27(Thu) 16:35:20)

分類:[VB.NET/VB2005 以降] 

環境:Windows7、VB2017、.Net4.7.2、WindowsForm

System.Windows.FormsのRichTextBoxでファイルに保存できない文字があります。
文字はU+FFFD(REPLACEMENT CHARACTER)です。
読み書きするファイルはリッチ テキスト形式 (.rtf) で、RichTextBox.LoadFile及びSaveFileで入出力しています。
RichTextBoxでの入力は[Alt]+[X]キーによる入力はNG、IMEパッドからの入力はできて、表示もされます。

以下の操作でU+FFFDを表示するにはどうすればよいでしょうか?

(1)RichTextBoxでIMEパッドからU+FFFD(REPLACEMENT CHARACTER)を入力
(2)RichTextBox.SaveFile(path)でリッチ テキスト形式 (.rtf)で保存
(3)RichTextBox.LoadFile(path)で読み込み ★ここで入力したはずのU+FFFDが表示されない。
引用返信 編集キー/
■93963 / inTopicNo.2)  Re[1]: RichTextBoxでファイル保存できない文字
□投稿者/ 魔界の仮面弁士 (2573回)-(2020/02/27(Thu) 17:05:32)
No93961 (otu さん) に返信
> System.Windows.FormsのRichTextBoxでファイルに保存できない文字があります。

手元に Win7 が無いので確認できませんが、.NET Framework 4.7.2 ということなので、
RichEdit v4.1 (msftedit.dll) と RichEdit v3 (riched20.dll) の違いが
影響しているかもしれません。

今更 .NET 4.6.2 以下に戻すわけにもいかないでしょうから、
ひとまず DoNotLoadLatestRichEditControl の オプトアウトスイッチにて
v3 をロードさせてみては如何でしょう。もしかしたら保存できるようになるかも?


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=true"/>
</runtime>
</configuration>
引用返信 編集キー/
■93966 / inTopicNo.3)  Re[2]: RichTextBoxでファイル保存できない文字
□投稿者/ kaina (61回)-(2020/02/27(Thu) 18:30:48)
>(1)RichTextBoxでIMEパッドからU+FFFD(REPLACEMENT CHARACTER)を入力
>(2)RichTextBox.SaveFile(path)でリッチ テキスト形式 (.rtf)で保存
>(3)RichTextBox.LoadFile(path)で読み込み ★ここで入力したはずのU+FFFDが表示されない。

REPLACEMENT CHARACTER (U+FFFD)ってそもそも黒ひし形の中にはてなマークが表示される文字だけど
何も表示されないってことなのかな?
ちなみにこれは別の文字コードからUnicodeに変換する際に変換後の文字が無い場合に
使用される置き換え文字ですが、その認識は合っています?
引用返信 編集キー/
■93967 / inTopicNo.4)  Re[2]: RichTextBoxでファイル保存できない文字
□投稿者/ otu (2回)-(2020/02/27(Thu) 18:44:58)
No93963 (魔界の仮面弁士 さん) に返信

> 今更 .NET 4.6.2 以下に戻すわけにもいかないでしょうから、
> ひとまず DoNotLoadLatestRichEditControl の オプトアウトスイッチにて
> v3 をロードさせてみては如何でしょう。もしかしたら保存できるようになるかも?
>
>
> <?xml version="1.0" encoding="utf-8" ?>
> <configuration>
> <runtime>
> <AppContextSwitchOverrides value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=true"/>
> </runtime>
> </configuration>

ありがとうございます。ビンゴです。
上記で解決できました。
このようなスイッチがある事も知りませんでしたので、一人では絶対に解決できませんでした。
感謝。。。。

VersionダウンでOKというのも、なんだか複雑ですがOSとの関係でしょうか?
VB2008の時に作成した継承コントロールですが何か関係あるでしょうか?
Windows10だとRichEdit v4.1でも問題ないんですかね。

情報をお持ちの方、よろしくお願いします。

引用返信 編集キー/
■93968 / inTopicNo.5)  Re[3]: RichTextBoxでファイル保存できない文字
□投稿者/ otu (3回)-(2020/02/27(Thu) 18:53:25)
No93966 (kaina さん) に返信

> REPLACEMENT CHARACTER (U+FFFD)ってそもそも黒ひし形の中にはてなマークが表示される文字だけど
> 何も表示されないってことなのかな?
> ちなみにこれは別の文字コードからUnicodeに変換する際に変換後の文字が無い場合に
> 使用される置き換え文字ですが、その認識は合っています?

返信、ありがとうございます。
上記認識で合っています。
自分の備忘録用にRichTextBoxをワープロとして利用しています。
そこで以下のような文章を作成していて気が付きました。
 
UTF-8やUTF-16へのエンコード/デコードでは(U+FFFD REPLACEMENT CHARACTER)が代替文字に置き換わる。 
引用返信 編集キー/
■93969 / inTopicNo.6)  Re[3]: RichTextBoxでファイル保存できない文字
□投稿者/ 魔界の仮面弁士 (2574回)-(2020/02/27(Thu) 19:27:40)
2020/02/27(Thu) 23:27:41 編集(投稿者)

DoNotLoadLatestRichEditControl = true / false の検証結果が逆になっていたので訂正 m(_ _)m

No93967 (otu さん) に返信
> VersionダウンでOKというのも、なんだか複雑ですがOSとの関係でしょうか?

DoNotLoadLatestRichEditControl は .NET Framework 4.6 にて設けられたスイッチだそうです。
OS バージョンではなく、.NET Framework バージョンに依存することになるでしょう。

.NET 4.8 のソースコードで、RichEdit バージョンが影響するのはこのあたり。
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/RichTextBox.cs,d2aebb12b70acde0,references


なお、.NET Core 3.0 ではこのスイッチがサポートされておらず、常に RichTextBox の
新しいバージョンが使われることになります。(.NET 5 でも恐らく同様でしょう)


また、今回の REPLACEMENT CHARACTER については v5.1 から v3 に下げることで
解決したわけですが、その逆に、v3 だとうまくいかないケースもあることに注意が必要です。
https://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=one&namber=34264&type=34261&space=30&no=0


> Windows10だとRichEdit v4.1でも問題ないんですかね。

手元の Win10 (v1909) で REPLACEMENT CHARACTER を保存させたところ、
下記の動作となりました。

「DoNotLoadLatestRichEditControl 未設定」
.NET 2.0〜4.6.2 では保存されたが、
.NET 4.7〜4.8 では保存されない

「DoNotLoadLatestRichEditControl = true」
.NET 2.0〜4.8 いずれも保存された

「DoNotLoadLatestRichEditControl = false」
.NET 2.0〜3.5 では保存されたが、
.NET 4〜4.8 では保存されない


ただし、Win10 は、そもそも .NET 4〜4.5.2 をインストールできないため、
この範囲については、バージョンリダイレクトによって動作しているのだと
思います。Vista や Win7 上の 4〜4.5.2 で動作させた場合は、
Win10 とは異なる結果になるかもしれませんね。


> 情報をお持ちの方、よろしくお願いします。

このあたり?

https://docs.microsoft.com/en-us/windows/win32/controls/about-rich-edit-controls
https://docs.microsoft.com/ja-jp/archive/blogs/murrays/richedit-versions
引用返信 編集キー/
■93971 / inTopicNo.7)  Re[4]: RichTextBoxでファイル保存できない文字
□投稿者/ otu (4回)-(2020/02/27(Thu) 23:04:03)
No93969 (魔界の仮面弁士 さん) に返信

> 手元の Win10 (v1909) で REPLACEMENT CHARACTER を保存させたところ、
> 下記の動作となりました。
>
> 「DoNotLoadLatestRichEditControl 未設定」
> .NET 2.0〜4.6.2 では保存されたが、
> .NET 4.7〜4.8 では保存されない
>
> 「DoNotLoadLatestRichEditControl = false」
> .NET 2.0〜4.8 いずれも保存された
>
> 「DoNotLoadLatestRichEditControl = true」
> .NET 2.0〜3.5 では保存されたが、
> .NET 4〜4.8 では保存されない

実験して頂き、感謝します。
自分もPCにインストールされているFrameworkで4.6以上(4.6 4.6.1 4.7.2 4.8の4種類)について実験してみました。
DoNotLoadLatestRichEditControlがtrue、false、未設定の場合と、その時に使用されていたRichTextBoxのクラス名を調査しました。

以下が結果です。○は保存された。×はNGです。
魔界の仮面弁士さんと未設定の場合は同じ結果となり、true,falseの場合は異なる結果となりました。
RichEdit20Wの時がOKで、以下によると、おそらくRichEditのVersion3.0か3.1なのでしょう。
https://stackoverflow.com/questions/32397734/get-version-of-rich-edit-library

いずれにしても今回の件で以下の事がわかりました。
(1)RichTextBoxはVersion3.1以下(riched20.dll)と4.1以上(msftedit.dll)で異なる挙動をする。
(2)上記の切替はDoNotLoadLatestRichEditControlスイッチで切替できる。(.NET CoreはNG)

Win7 .Net4.8、4.7.2
true(○):WindowsForms10.RichEdit20W.app.0.141b42a_r15_ad1
false(×):WindowsForms10.RICHEDIT50W.app.0.141b42a_r15_ad1
未設定(×):WindowsForms10.RICHEDIT50W.app.0.141b42a_r15_ad1

Win7 .Net4.6.1、4.6
true(○):WindowsForms10.RichEdit20W.app.0.141b42a_r15_ad1
false(×):WindowsForms10.RICHEDIT50W.app.0.141b42a_r15_ad1
未設定(○):WindowsForms10.RichEdit20W.app.0.141b42a_r15_ad1

どうも、ありがとうございました。
自分の中で納得できたので、これにて解決とさせていただきます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ