메모장에서 txt 파일 내용을 이상한 기호로 표시합니다.

메모장에서 txt 파일 내용을 이상한 기호로 표시합니다.

다음과 같은 것을 사용하여 kotlin(kotlin Int 유형)에서 파일에 정수 값을 쓰고 있습니다.

var1BufferedWriter?.write(String.format("%d\n", intvar ) )   
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )    

var1textfile.txt위의 내용은 및 var2에 기록됩니다 textfile_hex.txt. 둘 다 안드로이드 폰 SD카드 메모리에 저장됩니다. Windows PC에 복사하여 메모장에서 열면 textfile.txt가 다음과 같이 보입니다.

여기에 이미지 설명을 입력하세요

textfile_hex.txt는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

16진수 편집기에서 textfile.txt를 열면 파일의 모든 데이터가 정확하고 예상되는 데이터가 무엇인지 확인할 수 있습니다. Notepad++는 모든 것을 올바르게 표시합니다. 이상한 부분은 주말 전에 동일한 앱을 사용하여 textfile.txt와 유사한 다른 많은 파일을 생성했는데 Windows에서 모두 정상적으로 보였습니다. 안드로이드나 메모장 설정에서는 아무것도 변경되지 않았습니다.

이게 정상적인 행동인가요? 이것은 일종의 인코딩 문제입니까? 메모장이 일부 txt 파일을 올바르게 표시하고 다른 파일은 올바르게 표시하지 않는 이유는 무엇입니까?

Windows 버전:
Edition Windows 10 Pro
버전 22H2
OS 빌드 19045.4046
체험 Windows 기능 체험 팩 1000.19053.1000.0

답변1

파일이 트리거됩니다.거짓 긍정메모장의 "유니코드인지" 감지에서. (이 문제는 심지어자체 Wikipedia 페이지.)

  • 'intvar'가 항상 0인 경우 파일은 ASCII(및/또는 UTF-8)의 "0\n"바이트로 저장되는 Repeated 로 완전히 구성됩니다.{0x30, 0x0A}

    "0"  "\n"  "0"  "\n"  "0"  "\n"  ...
    30   0A    30   0A    30   0A    ...
    
  • "ਰ"일명 유니코드 문자가 표시됩니다 "\u0A30".U+0A30, 이는또한{0x30, 0x0A}UTF-16 LE의 바이트로 저장됩니다 .

    "ਰ"     "ਰ"     "ਰ"    ...
    30 0A   30 0A   30 0A  ...
    

출력을 약간 변경하면(예: "분명히 ASCII" 헤더나 주석을 추가하면) 문제를 해결할 수 있습니다.

파일 내용 "\xEF\xBB\xBF"(또는 "\uFEFF"Java/Kotlin이 선호하는 철자) 앞에 붙을 수도 있습니다. 이는 파일이 UTF-8이고 메모장(및 기타 모든 텍스트 편집기)이 자동 감지를 건너뛰게 한다는 것을 나타내는 표준 헤더입니다.

Android가 지원하는 경우 다음과 같이 파일을 쓰도록 할 수 있습니다.실제UTF-16(형식 감지의 이 부분을 우회할 수 있도록 BOM을 포함하는 것이 좋음).

(다른 파일에는 적어도 하나의 값 ≥10이 있기 때문에 문제가 발생하지 않을 수 있습니다. 이는 바이트를 "잘못 정렬"하여 감지 코드에 대해 ASCII와 조금 더 유사하고 UTF-16과 조금 덜 유사하게 보입니다.)

관련 정보