악센트 문자가 포함된 클립보드에서 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
'programing' 카테고리의 다른 글
CMD가 Administrator로 실행 중인지, 상승된 권한을 가지고 있는지를 검출하는 방법 (0) | 2023.04.19 |
---|---|
vba를 사용하여 다른 워크북에 시트를 복사하는 방법 (0) | 2023.04.19 |
Swift에서 버튼 텍스트를 되돌리는 방법 (0) | 2023.04.19 |
시스템 입수 방법창문들.'참'을 반환하려면 ShowDialog()를 선택하십시오. (0) | 2023.04.19 |
vba의 열 번호를 사용하여 Excel 범위를 생성하시겠습니까? (0) | 2023.04.19 |