6

複数の連絡先を含む vCard (VCF) ファイルを連絡先ごとに個別のファイルに分割するプログラムをC#で作成しようとしています。vCard を読み取るには、ほとんどの携帯電話で ANSI (1252) として保存する必要があることを理解しています。

ただし、を使用して VCF ファイルを開き、 (エンコーディング形式として 1252 を設定して)StreamReaderで書き戻すとStreamWriter、すべての特殊文字が , のようåæ書き込まøれ、?. ANSI (1252) はこれらの文字を確実にサポートします。これを修正するにはどうすればよいですか?

編集:ファイルの読み取りと書き込みに使用するコードは次のとおりです。

private void ReadFile()
{
   StreamReader sreader = new StreamReader(sourceVCFFile);
   string fullFileContents = sreader.ReadToEnd();
}

private void WriteFile()
{
   StreamWriter swriter = new StreamWriter(sourceVCFFile, false, Encoding.GetEncoding(1252));
   swriter.Write(fullFileContents);
}
4

1 に答える 1

12

Windows-1252 が上記の特殊文字をサポートしていると仮定するのは正しいです (完全なリストについては、ウィキペディアのエントリを参照してください)。

using (var writer = new StreamWriter(destination, true, Encoding.GetEncoding(1252)))
{
    writer.WriteLine(source);
}

上記のコードを使用したテスト アプリでは、次の結果が得られました。

Look at the cool letters I can make: å, æ, and ø!

疑問符は見つかりません。で読み込むときにエンコードを設定していStreamReaderますか?

編集:Encoding.Convert UTF-8 VCF ファイルを Windows-1252 に変換するため に使用できるはずです。の必要はありませんRegex.Replace。これが私がそれを行う方法です:

// You might want to think of a better method name.
public string ConvertUTF8ToWin1252(string source)
{
    Encoding utf8 = new UTF8Encoding();
    Encoding win1252 = Encoding.GetEncoding(1252);

    byte[] input = source.ToUTF8ByteArray();  // Note the use of my extension method
    byte[] output = Encoding.Convert(utf8, win1252, input);

    return win1252.GetString(output);
}

そして、これが私の拡張メソッドの外観です。

public static class StringHelper
{
    // It should be noted that this method is expecting UTF-8 input only,
    // so you probably should give it a more fitting name.
    public static byte[] ToUTF8ByteArray(this string str)
    {
        Encoding encoding = new UTF8Encoding();
        return encoding.GetBytes(str);
    }
}

また、おそらくandメソッドにs を追加したいと思うでしょう。usingReadFileWriteFile

于 2010-12-04T05:10:29.977 に答える