source

c#, Excel + csv: 올바른 인코딩을 얻으려면 어떻게 해야 합니까?

manysource 2023. 10. 2. 15:07

c#, Excel + csv: 올바른 인코딩을 얻으려면 어떻게 해야 합니까?

나는 이것을 꽤 오랫동안 시도해 보았지만, 그것을 알아낼 수가 없습니다.*.csv 파일을 통해 엑셀로 데이터를 내보내려고 합니다.지금까지는 잘 작동하지만 엑셀에서 파일을 열 때 인코딩 문제가 좀 있습니다.

(왼쪽의 원래 문자열, 오른쪽의 EXCEL 결과):

Messwert(µm / m) ==> Messwert(µm / m)

Dümme Mässöng ==> Dümme Mässöng

메모장++는 파일이 "ANSI as UTF8"(WTF?)로 인코딩되었음을 알려줍니다.

다음은 제가 타당한 결과를 얻기 위해 노력한 여러 가지 방법입니다. 바로 분명한 구현입니다.

tWriter.Write(";Messwert(µm /m)");

더 정교한 것(tried를 들어 십여 개 이상의 인코딩 조합)

tWriter.Write(Encoding.Default.GetString(Encoding.Unicode.GetBytes(";Messwert(µm /m)")));
tWriter.Write(Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(";Messwert(µm /m)")));

기타 등등

데이터 생성 방법의 전체 소스 코드:

    MemoryStream tStream = new MemoryStream();
    StreamWriter tWriter = new StreamWriter(tStream);
    tWriter.Write("\uFEFF");

    tWriter.WriteLine(string.Format("{0}", aMeasurement.Name));
    tWriter.WriteLine(aMeasurement.Comment);
    tWriter.WriteLine();
    tWriter.WriteLine("Zeit in Minuten;Messwert(µm / m)");

    TimeSpan tSpan;
    foreach (IMeasuringPoint tPoint in aMeasurement)
    {
        tSpan = new TimeSpan(tPoint.Time - aMeasurement[0].Time);
        tWriter.WriteLine(string.Format("{0};{1};", (int)tSpan.TotalMinutes, getMPString(tPoint)));
    }

    tWriter.Flush();
    return tStream;

생성된 CSV 파일:

Dümme Mössäng
Testmessung die erste

Zeit in Minuten;Messwert(µm / m)
0;-703;
0;-381;
1;1039;
1;1045;
2;1457;
2;1045;

이것은 저에게 완벽하게 효과가 있었습니다.

private const int WIN_1252_CP = 1252; // Windows ANSI codepage 1252

    this._writer = new StreamWriter(fileName, false, Encoding.GetEncoding(WIN_1252_CP));

CSV 인코딩 문제(Microsoft Excel)

다음을 시도해 봅니다.

using (var sw = File.Create(Path.Combine(txtPath.Text, "UTF8.csv")))
{
  var preamble = Encoding.UTF8.GetPreamble();
  sw.Write(preamble, 0, preamble.Length);
  var data = Encoding.UTF8.GetBytes("懘荧,\"Hello\",text");
  sw.Write(data, 0, data.Length);
}

UTF8 인코딩된 CSV를 쓰기 전에 파일에 적절한 UTF8 프리앰블을 씁니다.

솔루션은 Java 애플리케이션에 대한 수정 사항으로 작성되지만 C#에서 유사한 작업을 수행할 수 있어야 합니다.StreamWriter 클래스에 대한 설명서에서 BOM(Byte Order Mark)을 참조하는 설명을 살펴볼 수도 있습니다.

"ANSI as UTF8"(WTF?)

참고Pad++가 맞을 수 있습니다.부호화는 UTF8(즉, 올바른 유니코드 헤더)이지만 ANSI 데이터만 포함합니다(즉, é는 올바른 UTF8 방식으로 부호화되지 않으며, 즉 2바이트를 의미함).

또는: 반대입니다.ANSI(no file header BOM)이지만, 개별 문자의 인코딩은 UTF8이거나 UTF8처럼 보입니다.이것은 ü와 다른 문자들이 둘 이상의 다른 문자들로 확장되는 것을 설명해 줄 것입니다.파일을 유니코드로 읽도록 하면 이 문제를 해결할 수 있습니다.

CSV를 게시(일부)할 수 있다면 소스에서 수정할 수 있습니다.

편집

이제 귀하의 코드를 확인했습니다. StreamWriter를 제거하고 TextWriter로 대체할 수 있습니까?또한 BOM의 핸드 인코딩을 제거해야 합니다. 필요 없습니다.TextWriter를 만들 때 인코딩을 지정할 수 있습니다(ASCII를 사용하지 말고 UTF8을 시도하십시오).

트레버 저메인이 정확한 암호화 형식으로 저장하는 걸 도와줬습니다

using (var sw = File.Create(Path.Combine(txtPath.Text, "UTF8.csv")))
{
    var preamble = Encoding.UTF8.GetPreamble();  
    sw.Write(preamble, 0, preamble.Length);  
    var data = Encoding.UTF8.GetBytes("懘荧,\"Hello\",text");  
    sw.Write(data, 0, data.Length);
}

텍스트 파일을 육각형 편집기로 열고 실제로 무엇인지 확인해 보는 것이 좋습니다.UTF-16의 BOM은 0xFEFF이며, 이는 쓰기 코드가 스트림에 쓰고 있는 것으로 보이지만 나머지 쓰기 코드는 사용할 인코딩을 지정하지 않습니다. 이는 StreamWriter의 기본 인코딩인 UTF-8을 사용합니다.암호화가 뒤섞여 있는 것 같습니다.

16진수 보기에서 파일을 열 때 문자 사이에 0x00이 많이 보이면 UTF-16으로 작업하는 것으로 인코딩입니다.C#의 유니코드.문자 사이에 0x00이 없는 경우 부호화는 UTF-8일 수 있습니다.

을 BOM 만 하면 됩니다.EF BB BFFE FF UTF-8 를 으로 읽습니다.

StreamWriter를 사용하는 시나리오의 경우 명시적으로 StreamWriter로 UTF8 인코딩을 전달하여 엑셀이 올바른 인코딩을 사용하여 파일을 읽을 수 있게 했습니다.

자세한 내용은 이 답변을 참조하십시오. https://stackoverflow.com/a/22306937/999048

언급URL : https://stackoverflow.com/questions/3346529/c-excel-csv-how-to-get-the-correct-encoding