/ / C#でUnicodeファイルを保存するときの「???」記号-C#、Unicode

"???"記号はC#でユニコードファイルを保存するとき - c#、unicode

設定を保存するときに問題が発生します-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は4
Encoding.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 文字列を直接書き込む。