라틴 문자 대신 중국어 문자가 파일에 기록됩니다.

라틴 문자 대신 중국어 문자가 파일에 기록됩니다.

sed다음과 같이 실행하고 콘솔에 인쇄 하면 모든 것이 정상입니다.

sed '/Q/{
s/Q//g
r /Users/ericbrotto/Desktop/question.txt
}' Commision.txt

하지만 이렇게 하고 ta 파일을 출력하면 다음과 같습니다.

sed '/Q/{
s/Q//g
r /Users/ericbrotto/Desktop/question.txt
}' Commision.txt > newFile

...내 새 문자열(이전 출력에서 ​​올바르게 대체된 문자열)은 이제 아시아(북경어라고 믿습니다) 문자 묶음으로 읽혀집니다.

어떤 아이디어가 있나요?

후속 질문입니다내 이전 질문.

답변1

이전에 ASCII로 인코딩된 텍스트(또는 이와 동등하게 UTF-8로 인코딩된 ASCII 텍스트)를 UTF-16으로 디코딩하면 "한자"(UTF로 디코딩할지 여부에 따라 다른 문자)가 표시되는 경우가 많다는 것을 알고 있습니다. -16BE 또는 UTF-16LE). 이를 바탕으로 혼합 인코딩을 다루고 있다고 생각합니다. 내 생각에는 일반 ASCII(또는 UTF-8로 인코딩된 ASCII) Commision.txt인 UTF-16BE 또는 UTF-16LE로 인코딩되어 question.txt결국 newFile두 파일 모두에 대해 잘못된 인코딩 조합이 되는 것 같습니다.

두 파일 모두에서 동일한 인코딩을 사용하면 상황이 더 좋아질 것입니다. 아마도 UTF-8이 가장 잘 작동할 것입니다. 최종 출력이 다른 인코딩으로 필요하면 다음을 사용할 수 있습니다.변환( iconv -f UTF-8 -t UTF-16BE <newFile >newfile.utf16be.txt)합니다.


실제로 ASCII 문자의 UTF-16 인코딩은 ASCII 인코딩과 동일하지만 추가 NUL 문자가 각 ASCII 문자 사이에 삽입되고 또 다른 NUL이 전체 문자 앞이나 뒤에 삽입됩니다(UTF-16 인코딩에 따라 다름). 캐릭터의 섹션 순서). 이는 UTF-8 또는 UTF-16으로 인코딩된 ASCII 텍스트가 UTF-8 터미널에서 직접 볼 때(즉, "콘솔에 인쇄된") "정상"으로 보인다는 것을 의미합니다.

파일 내용이 독립적으로 유지되는 한 모든 인코딩 감지 보기 환경(예: 편집기)은 인코딩을 올바르게 감지할 가능성이 높습니다(또는 UTF-8 및 많은 단일 바이트 인코딩이 동일) ASCII 범위 내에서).

근데 너가 갖고 있잖아sed파일을 함께 섞으세요. 안타깝게도,sed두 가지 다른 텍스트 인코딩을 사용하여 파일을 처리하고 있다는 것을 인식할 만큼 "지능적"이지 않습니다. 내 추측으로는 대부분 UTF-16으로 인코딩된 파일(from) Commision.txt이 되고 중간(from)(또는 어디에 두든) UTF-8로 인코딩된 부분이 있게 됩니다 . 완전히 UTF-8로 디코딩된 경우 결과가 유효하지 않을 수 있지만 UTF-16으로 완전히 디코딩된 경우에는 유효할 수 있습니다(UTF-8 데이터가 있는 곳에 예상치 못한 내용이 포함되어 있음에도 불구하고).question.txtQ


예는 다음과 같습니다.

Commision.txtUTF-16BE로 인코딩된 ASCII(BOM 포함)입니다.

% xxd Commision.txt 
0000000: feff 0046 0069 0072 0073 0074 0020 006c  ...F.i.r.s.t. .l
0000010: 0069 006e 0065 000a 004c 0069 006e 0065  .i.n.e...L.i.n.e
0000020: 0020 0077 0069 0074 0068 0020 0061 0020  . .w.i.t.h. .a. 
0000030: 0075 0063 0020 0027 0071 0027 003a 0020  .u.c. .'.q.'.:. 
0000040: 0028 0051 0029 000a 004c 0061 0073 0074  .(.Q.)...L.a.s.t
0000050: 0020 006c 0069 006e 0065 000a            . .l.i.n.e..

question.txtASCII(또는 UTF-8로 인코딩된 ASCII)입니다.

% xxd question.txt
0000000: 5768 6174 2069 7320 7468 6520 6169 722d  What is the air-
0000010: 7370 6565 6420 7665 6c6f 6369 7479 206f  speed velocity o
0000020: 6620 616e 2075 6e6c 6164 656e 2073 7761  f an unladen swa
0000030: 6c6c 6f77 3f0a                           llow?.

나는 그것들을 결합한다sed.

% sed '/Q/{
s/Q//g
r question.txt
}' Commision.txt >newFile

newFile엉망이에요.

sed2바이트 UTF-16 표현( ) 대신 Q단일 바이트( )를 제거했습니다 . 이는 파일의 나머지 부분에 대한 2바이트 정렬을 중단하고 전체 길이 대신 홀수를 제공하고 UTF-16 NULL( )을 도입합니다.5100 51
0000

% xxd newFile
0000000: feff 0046 0069 0072 0073 0074 0020 006c  ...F.i.r.s.t. .l
0000010: 0069 006e 0065 000a 004c 0069 006e 0065  .i.n.e...L.i.n.e
0000020: 0020 0077 0069 0074 0068 0020 0061 0020  . .w.i.t.h. .a. 
0000030: 0075 0063 0020 0027 0071 0027 003a 0020  .u.c. .'.q.'.:. 
0000040: 0028 0000 2900 0a57 6861 7420 6973 2074  .(..)..What is t
0000050: 6865 2061 6972 2d73 7065 6564 2076 656c  he air-speed vel
0000060: 6f63 6974 7920 6f66 2061 6e20 756e 6c61  ocity of an unla
0000070: 6465 6e20 7377 616c 6c6f 773f 0a00 4c00  den swallow?..L.
0000080: 6100 7300 7400 2000 6c00 6900 6e00 6500  a.s.t. .l.i.n.e.
0000090: 0a                                       .

엉망이더라도 내 UTF-8 터미널에서는 괜찮아 보입니다.

% cat newFile
First line
Line with a uc 'q': ()
What is the air-speed velocity of an unladen swallow?
Last line

그러나 Vim에 로드하면 뭔가 분명히 잘못되었습니다(실제로 여는 괄호 뒤에 NUL이 있지만 그 존재로 인해 이 게시물이 잘립니다). Vim은 "라인 2의 변환 오류"라고 경고합니다.

First line
Line with a uc 'q': (⤀੗桡琠楳⁴桥⁡楲⵳灥敤⁶敬潣楴礠潦⁡渠畮污摥渠獷慬汯眿਀䰀愀猀琀 氀椀渀攀

물음표를 제거하고 question.txt(다시 짝수 바이트 제공) 재생성하면 newFile마지막 줄을 "뒤로" 가져오고(두 번째 줄 끝에 붙어 있지만) Vim의 변환 경고를 피합니다.

First line
Line with a uc 'q': (⤀੗桡琠楳⁴桥⁡楲⵳灥敤⁶敬潣楴礠潦⁡渠畮污摥渠獷慬汯眊Last line

관련 정보