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));
다음을 시도해 봅니다.
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 BF
FE 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
'source' 카테고리의 다른 글
RHEL 서버에서 mysql 클라이언트를 깨끗하고 안전하게 제거하는 방법은? (0) | 2023.10.07 |
---|---|
워드프레스 카테고리 가져오기 링크 (0) | 2023.10.02 |
XML 파일에서 날짜/시간에 사용할 올바른 형식은 무엇입니까? (0) | 2023.10.02 |
프로 없이 사용하는 것이 불법인 폰타썸 아이콘 패키지? (0) | 2023.10.02 |
PowerShell 단계를 통해 느린 시작 수정 (0) | 2023.10.02 |