設定を保存するときに問題が発生します-Unicodeテキストは「???」として保存されます。しかし、問題は.Net Framework v 2を備えたWindows 2003でのみ発生します。 .Net 4を使用してWinXPでコードをテストすると、設定で.Net Framework v2をターゲットにしているにもかかわらず、問題なく動作します。 のような異なる変換を行ってみました
Encoding.ASCII.GetString(
Encoding.Convert(Encoding.ASCII,
Encoding.Unicode,
Encoding.Unicode.GetBytes(backupPathTextBox.Text)));
しかし、常に "???"またはいくつかの読み取り不可能なシンボル。私はこの質問をグーグルで調べ、すべてのC#文字列がUTF16コードページで表されているが、C#にはUTF16デコーダbuitl-inがないことを発見しました。 誰かが正しい方向に私を導くことができますか?
回答:
回答№1は4Encoding.ASCII.GetString(
Encoding.Convert(Encoding.ASCII,
Encoding.Unicode,
Encoding.Unicode.GetBytes(backupPathTextBox.Text)));
Encoding.Unicode
実際にはUTF-16LEエンコーディングです。コード単位は2バイトを使用して保存されます(したがって、ASCII文字は各バイト間に0バイトで終わります)。マイクロソフトはこれを「Unicode」と呼んでいます。「初期の頃、Unicodeの最も一般的なエンコーディングとして使用されると予想されていましたが、そのようには機能しませんでした。
あなたのコードは何をします:
テキスト文字列をUTF-16LEバイトに変換します。
次に、それらをASCIIバイト(「そうではない」)からUTF-16LEバイトに変換します。これは、各バイトの間に余分なゼロバイトが追加されることを意味します。
次に、それらのバイトをあたかも文字列に変換しますそれらはASCIIでした。つまり、基本的に最初と同じ文字列を取得しますが、1文字あたり3バイトがゼロで、非ASCII文字が2文字になります。
これで何をしようとしていたのですか? ASCII互換のテキストファイルにUnicode文字列を配置する場合、必要なエンコーディングは通常utf-8であり、UTF-16ではありません。文字列をutf-8バイトに変換するのは簡単です:
new UTF8Encoding(false).GetBytes(backupPathTextBox.Text)
または単にutf-8を使用してください TextWriter
文字列を直接書き込む。