programing

악센트 문자가 포함된 클립보드에서 CSV 데이터 가져오기(Excel에서 붙여넣기)

elseif 2023. 4. 19. 22:26

악센트 문자가 포함된 클립보드에서 CSV 데이터 가져오기(Excel에서 붙여넣기)

시나리오

  • 사용자가 Excel에서 셀을 복사하여 클립보드에 넣습니다.
  • 그리고 내 애플리케이션은 클립보드에서 그 셀들을 가져올 것이다.

문제

  • 내 코드가 클립보드에서 CSV 형식을 가져옵니다.
  • 단, 원래 Excel 콘텐츠에 ((a, umlaut 포함)와 같은 문자가 포함되어 있는 경우 검색된 CSV 문자열에 올바른 문자가 없습니다(A는 나에게 "사각형"으로 표시됨).
  • 이에 비해 내 코드가 클립보드에서 유니코드 텍스트 형식을 가져오면 모든 것이 정상적으로 작동합니다: 클립보드에서 가져온 문자열에 the가 보존됩니다.

소스 코드 - 원본 - 문제 있음

[STAThread]
static void Main(string[] args)
{
    var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;

    // read the CSV
    var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
    var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
    var enc = new System.Text.UTF8Encoding();
    var reader = new System.IO.StreamReader(stream,enc);
    string data_csv = reader.ReadToEnd();

    // read the unicode string
    string data_string = System.Windows.Forms.Clipboard.GetText();



}

샘플 코드 실행 시 결과

  • 재평가 절차: Excel에 텍스트를 입력하고('dopelgénger'라는 단어와 숫자를 함께 사용) Ctrl+C를 눌러 클립보드에 복사한 후 위의 코드를 실행합니다.
  • data_csv가 "snger, 1\r\n2,3\r\n0"으로 설정되어 있다.
  • data_string은 "syselgénger\t1\r\n2\t3\r\n"로 설정되어 있습니다.

질문.

  • 올바른 문자를 얻으려면 어떻게 해야 하나요?

평.

  • 네, Unicode 텍스트를 사용하면 이 문제를 해결할 수 있습니다.하지만 CSV에 무슨 일이 일어나고 있는지 알고 싶습니다.
  • 스트림을 검색할 때 UTF-8 인코딩을 사용하든 사용하지 않든 결과에 차이가 없습니다.

정답

코멘트를 보고 Excel이 CSV용 클립보드에 어떤 내용을 삽입하고 있는지 주의해 본 결과, Excel이 UTF-8이 아닌 "레거시" 인코딩을 사용하고 있는 것이 타당하다고 생각했기 때문에 Windows 1252 코드 페이지를 사용하여 인코딩을 시도했습니다.아래 코드를 참조해 주세요.

소스코드 - 답변 첨부

[STAThread]
static void Main(string[] args)
{
    var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;

    //read the CSV
    var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
    var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
    var enc = System.Text.Encoding.GetEncoding(1252);
    var reader = new System.IO.StreamReader(stream,enc);
    string data_csv= reader.ReadToEnd();

    //read the Unicode String
    string data_string = System.Windows.Forms.Clipboard.GetText();
}

Excel은 유니코드 문자 인코딩을 사용하여 클립보드에 문자열을 저장합니다.ANSI에서 문자열을 읽으려고 할 때 정사각형이 표시되는 이유는 시스템의 ANSI 코드 페이지에 해당 문자가 표시되지 않기 때문입니다.유니코드만 쓰면 돼요.현지화 문제에 대처하는 경우 ANSI는 필요 이상으로 큰 문제가 됩니다.

편집: Joel Spolsky는 문자 인코딩에 대한 훌륭한 소개를 작성했습니다.이것은 확실히 확인할 가치가 있습니다.모든 소프트웨어 개발자는 Unicode와 문자 집합에 대해 절대적으로 알아야 합니다(변명 없음).

스트림을 UTF8로 인코딩할 수 없습니다.umlaut의 바이트가 "대체 문자" 유니코드 문자로 변환됩니다.

대신 별도의 인코딩 지시 없이 스트림의 데이터를 보십시오.데이터는 Excel에서 사용하는 설정 형식입니다.언로우가 있는 바이트를 보면 알 수 있습니다.그 후 UTF-8로 변환할 수 있습니다.

최악의 경우는 CSV 포메터가 ASCII가 아닌 모든 것을 폐기하는 경우입니다.이 경우 데이터 포맷터를 직접 작성할 수 있습니다.

Excel 사용자는 CSV가 ASCII만을 의미하는 것으로 알고 있습니다.http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.misc/2008-07/msg02270.html 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/967878/get-csv-data-from-clipboard-pasted-from-excel-that-contains-accented-character